详解python3实现的web端json通信协议
之前有用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/evnpython3 #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) fromurllib.requestimporturlopen fromurllib.parseimportquote importjson classweb_json: def__init__(self,base_url): self.base_url=base_url defget_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)) returnjsonStr #get方法 defurl_get(self,params): returnself.get_url_data(params,None) #post方法 defurl_post(self,params,data): data=bytes(data,'utf8') returnself.get_url_data(params,data)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。