이 글은 주로 python3으로 구현된 웹사이드 json 통신 프로토콜을 소개합니다. 관심 있는 친구들은 참고할 수 있습니다.
이전에는 python3을 사용하여 tcp 프로토콜을 구현했고, 나중에는 http 프로토콜 통신을 구현해 보았습니다.
한동안 작업한 끝에 회사에서는 기능적인 자동 테스트 시스템을 만들고 싶습니다. 오후에 json 형식이 구현이 더 간단하다는 것을 알았습니다. 코드는 다음과 같습니다. 간단히 설명하면 서버와의 통신은 일반적으로 두 부분으로 나뉘는데, 하나는 get 프로토콜이고 다른 하나는 post 프로토콜입니다.
get 프로토콜은 매우 간단하며 직접 액세스할 수 있습니다. post 프로토콜은 실제로 데이터가 사용될 때 프로그램이 자동으로 유형을 식별합니다.
작성 과정에서 3가지 문제가 발생했습니다.
1 포스트 프로토콜을 구현할 때 오류가 발생했습니다.
일반적으로 데이터 형식의 문제는 매우 쉽습니다. 간단하게 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, verify_ascii= False, indent=2)) 코드를 사용합니다. 여기서는 verify_ascii가 False여야 한다는 점에 유의해야 합니다. 그렇지 않으면 에 중국어가 있는 경우 표시되는 내용은 0xx 정도입니다. indent=2는 형식화된 json 표시를 의미하고, sort_keys는 이 json이 필요하지 않음을 의미합니다. sorted
#!/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)