之前有用
python3开发
实现过tcp
协议的
,
后来又实现了
http
协议的通信,今天公司想做一个功能自动测试系统,下午弄了一会,发现
json
格式的实现可以更简单一点,代码如下:简单解说一下,一般与服务器通信分两块,一块是
get
协议,一块是
post
协议,
get
协议很简单,直接就可访问了,
post
协议,实际上把
data
数据用起来,程序直接会自动辨别类型。
在写的过程中遇到3
个问题:
1
在实现
post
协议时曾遇到错误,
大致说数据格式的问题,解决方法很简单,转为utf-8
格式:
bytes(data, ' utf8 ' )
,
2
获取到的
json
数据遇到里面中文时遇到编码问题
发现表现出0xaa0xbb0xcc0xdd
这样的编码,
json
加载时调用
utf8
即可,使用这一句代码:
json.loads(rawtext.decode( ' utf8 ' ))
3
打印出
json
时表现出一行很长很长的字符串
长长的字符串看了非常痛苦,根本看不清json
里面各对像的关系,网上说用什么
json.tool
方法解决,不过那是针对命令行的,我这是在调试过程中还是希望直接打印出来,
采用如下代码: print (json.dumps(jsonStr, sort_keys=False, ensure_ascii= False, indent=2 ))
,这里需要注意
ensure_ascii
必须为
False
,否则里面有中文时
看到的又是0xx
什么的,
indent=2
表示格式化
json
显示,
sort_keys
则表示此
json
无需排序
#!/usr/bin/evn python3#coding=utf-8
#
针对
web
端
json
协议的通信库,通信协议为
json,
传出的
data
为
json
格式,接收的数据也是
json
格式
#
外界调用时可先初始化
web_json
类,如下所示:
# get
调用
# web = web_json("http://baidu.com/")# params = "abcd/select/100000?userID=1234&groupID=79"# web.url_get(params)# # post
调用
# web = web_json("http://baidu.com/")# params = "abcd/select/100000"# data = '{"name": "jack", "id": "1"}'# web.url_post(params, data)
from urllib.request
import urlopen
from urllib.parse
import quote
import json
class
web_json:
def
__init__(self, base_url):
self.base_url = base_url
def
get_url_data(self, params, data):
web = urlopen(self.base_url + params, data)
print (web.url)
print ("status: " , web.status)
rawtext = web.read()
jsonStr = json.loads(rawtext.decode('utf8'))
print (json.dumps(jsonStr, sort_keys=
False, ensure_ascii=
False, indent=2))
return jsonStr
# get
方法
def
url_get(self, params):
return self.get_url_data(params,
None)
# post
方法
def
url_post(self, params, data):
data=bytes(data, 'utf8')
return self.get_url_data(params, data)
来源:
博客园