本篇文章主要介紹了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/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)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。
更多詳解python3實現的web端json通訊協定相關文章請關注PHP中文網!