Python 基于urllib.request封装http协议类

测试环境: Python版本:Python 3.3 代码实践 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' import urllib.request import http.cookiejar import urllib.parse class MyHttp: '''配置要测试请求服务器的ip、端口、域名等信息,封装http请求方法,http头设置''' def __init__(self, protocol, host, port, header = {}): # 从配置文件中读取接口服务器IP、域名,端口 self.protocol = protocol self.host = host self.port = port self.headers = header # http 头 #install cookie #自动管理cookie cj = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) urllib.request.install_opener(opener) def set_host(self, host): self.host = host def get_host(self): return self.host def get_protocol(self): return self.protocol def set_port(self, port): self.port = port def get_port(self): return self.port # 设置http头 def set_header(self, headers): self.headers = headers # 封装HTTP GET请求方法 def get(self, url, params=''): url = self.protocol + '://' + self.host + ':' + str(self.port) + url + params print('发起的请求为:%s' % url) request = urllib.request.Request(url, headers=self.headers) try: response = urllib.request.urlopen(request) response = response.read() return response except Exception as e: print('发送请求失败,原因:%s' % e) return None # 封装HTTP POST请求方法 def post(self, url, data=''): url = self.protocol + '://' + self.host + ':' + str(self.port) + url print('发起的请求为:%s' % url) request = urllib.request.Request(url, headers=self.headers) try: response = urllib.request.urlopen(request, data) response = response.read() return response except Exception as e: print('发送请求失败,原因:%s' % e) return None # 封装HTTP xxx请求方法 # 自由扩展 案例1: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' from httpprotocol import MyHttp if __name__ == '__main__': http = MyHttp('https', 'www.baifubao.com', 443) params = {"cmd":1059,"callback":"phone", "phone":"15850781443"} params = urllib.parse.urlencode(params) response = http.get('/callback?', params) print(response) 输出response内容如下: b'phone({"meta":{"result":"0","result_info":"","jump_url":""},"data":{"operator":"\\u79fb\\u52a8","area":"\\u6c5f\\u82cf","area_operator":"\\u6c5f\\u82cf\\u79fb\\u52a8","support_price":{"100":"115","500":"507","1000":"1000","2000":"2000","3000":"2996","5000":"4994","10000":"9989","20000":"19979","30000":"29969","50000":"49948"}}})' 如上,返回Unicode编码的数据:“"\\u79fb\\u52a8",……”, 解决方法:输出前先解码,如下 response = response.decode('unicode_escape') print(response) 解码后的输出如下: phone({"meta":{"result":"0","result_info":"","jump_url":""},"data":{"operator":"移动","area":"江苏","area_operator":"江苏移动","support_price":{"100":"115","500":"507","1000":"1000","2000":"2000","3000":"2996","5000":"4994","10000":"9989","20000":"19979","30000":"29969","50000":"49948"}}}) 案例2: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' from httpprotocol import MyHttp if __name__ == '__main__': http = MyHttp('http', 'www.webxml.com.cn', 80) # header = {'Content-Type':'text/xml','charset':'utf-8'} http.set_header(header) params = '''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/"> <soapenv:Header/> <soapenv:Body> <web:getSupportProvince/> </soapenv:Body> </soapenv:Envelope>''' params = params.encode(encoding='UTF-8') response = http.post('/WebServices/WeatherWebService.asmx?', params) print(response) 说明: 1、params = params.encode(encoding='UTF-8') # 如果未添加该行代码,会报错如下: POST data should be bytes or an iterable of bytes. It cannot be of type str. 2、 header = {'Content-Type':'text/xml','charset':'utf-8'} http.set_header(header) 以上两行代码,为请求添加请求头,如果未添加,则会报错,如下: HTTP Error 415: Unsupported Media Type 3、输出response,部分内容如下: \xe7\x9b\xb4\xe8\xbe\x96\xe5\xb8\x82\xe7\x89\xb9\xe5\x88\xab\xe8\xa1\x8c\xe6\x94\xbf\xe5\x8c\xba…… 如上,返回十六进制(\x表示16进制)的字符e7,9b等 解决方法:输出前先解码,如下 response = response.decode('utf-8') print(response) 解码后的输出结果: 直辖市特别行政区…… 案例3: import json from httpprotocol import MyHttp if __name__ == '__main__': http = MyHttp('http', 'info.so.360.cn', 80) header = {'Content-Type':'application/x-www-form-urlencoded','charset':'utf-8'} http = MyHttp('http', 'info.so.360.cn', 80) http.set_header(header) url = '/index.php?g=Embody&m=Index&a=submit' parmas = '{"websitetype":"博客论坛","url":"http://blog.sina.com.cn/ishouke","email":"1033553122@40qq.com","checkcode":"rkqj"}' parmas = parmas.encode('utf-8') response = http.post(url,parmas) print(response.decode('utf-8')) 说明:如果服务器支持的内容类型(‘Content-Type’)为json则要修改请求头,如下 header = {'Content-Type':'application/json','charset':'utf-8'}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老码农的一亩三分地

《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8

PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成。不管使用PDO对象中的query()方法,还是使用prepar...

6730
来自专栏Jerry的SAP技术分享

如何在Marketing Cloud Launchpad里创建新的tile

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

4810
来自专栏小灰灰

SpringBoot系列教程web篇之Get请求参数解析姿势汇总

一般在开发web应用的时候,如果提供http接口,最常见的http请求方式为GET/POST,我们知道这两种请求方式的一个显著区别是GET请求的参数在url中,...

13420
来自专栏自译文章/自学记录

Django配置流程

数据库设置 ENGINE: 指定所使用的是个什么样的数据库 NAME:指明 数据库的名称 USER:指示 数据库的用户名 PASSWOR...

8620
来自专栏Spring相关

开发dubbo应用程序(二)dubbo注册中心相关概述

​ 在Dubbo微服务体系中,注册中心是其核心组件之一.Dubbo通过注册中心实现了分布式环境中各微服务之间的注册与发现,是各分布式节点之间的纽带.其主要作...

9120
来自专栏自译文章/自学记录

Invalid url in admin of django

在Django admin页面,给 和IndexPromotionBanner相关的 数据表 添加数据时,遇到如下图的错误:

9920
来自专栏网站漏洞修复

网站漏洞解决与修复办法之seacms系统

临近9月底,seacms官方升级海洋cms系统到9.95版本,我们SINE安全在对其源码进行网站漏洞检测的时候发现问题,可导致全局变量被覆盖,后台可以存在越权漏...

13130
来自专栏老码农的一亩三分地

《细说PHP》第四版 样章 第18章 数据库抽象层PDO 7

在生成网页时,许多PHP脚本通常都会执行除参数外其他部分完全相同的查询语句。针对这种重复执行一个查询,但每次迭代使用不同参数的情况,PDO提供了一种名为预处理语...

7710
来自专栏自译文章/自学记录

re_path()

In order to perform URL reversing, you’ll need to use named URL patterns. The st...

9910
来自专栏python爱好部落

低成本做接口测试

我之前尝试录制,将录制好的请求进行处理,然后post/get出去。 结果有人做了一个很完备的工具,比我的要完备,好得太多。它就是HttpRunner. 关键是很...

13040

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励