Cet article présente principalement le protocole de communication json côté Web implémenté par python3. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer.
J'ai utilisé python3 pour implémenter le protocole TCP auparavant, puis j'ai implémenté le protocole de communication http. Aujourd'hui, l'entreprise souhaite créer un système de test automatique fonctionnel
Après avoir travaillé dessus pendant un certain temps. dans l'après-midi, j'ai trouvé que le format json La mise en œuvre peut être plus simple. Le code est le suivant : Pour expliquer brièvement, la communication avec le serveur est généralement divisée en deux parties, l'une est le protocole get et l'autre est le protocole post.
Le protocole get est très simple et est accessible directement. Le protocole post , en effet, lorsque des données sont utilisées, le programme identifiera automatiquement le type.
J'ai rencontré 3 problèmes lors du processus d'écriture :
1 J'ai rencontré une erreur lors de la mise en œuvre du protocole de publication
De manière générale, le problème du format des données est très simple à résoudre. résoudre. Simple, convertir au format utf-8 : bytes(data, 'utf8') ,
2 Les données json obtenues ont rencontré des problèmes d'encodage lors de la rencontre du chinois à l'intérieur de
et ont constaté qu'elles affichaient 0xaa0xbb0xcc0xdd. comme ça Pour l'encodage, appelez simplement utf8 lors du chargement de json. Utilisez ce code : json.loads(rawtext.decode('utf8'))
3 Lors de l'impression de json, une très longue chaîne apparaîtra
C'est très pénible de lire de longues chaînes, et je ne vois pas clairement la relation entre les objets dans json. Il existe des méthodes json.tool sur Internet pour résoudre le problème, mais c'est pour la ligne de commande. Je suis ici Pendant le processus de débogage, vous souhaitez toujours l'imprimer directement utilise le code suivant : print (json.dumps(jsonStr, sort_keys=False, Ensure_ascii= False, indent=2)). Il convient de noter ici que Ensure_ascii doit être False, sinon lorsqu'il contient du chinois , ce que vous voyez est 0xx ou quelque chose du genre, indent=2 signifie un affichage json formaté, sort_keys signifie que ce json n'a pas besoin d'être trié
#!/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)