application/json
在一般公司的普通业务场景中,application/json 很常见,用来告诉服务端,消息主体是序列化后的json字符串,即前端传给服务端的数据是json格式的。
也就是说,如果请求头中 content-type 为 application/json,那么我们在使用工具如postman或python脚本模拟请求接口时,请求参数也需要先转换成json格式,然后才能发送请求。代码示例如下:
import requests import json ''' 请求头的content-type为application/json ''' headers = {"Content-Type": "application/json;charset=utf8"} url = "http://127.0.0.1:5000/login" _data = { "username": "lilei", "password": "123456" } # 这里使用json参数,即json=_data res = requests.post(url=url, headers=headers, json=_data).text # 当然还可以使用data参数,但需先将_data转换为json格式,即data=json.dumps(_data) # json.dumps()将dict格式转换成json格式 res = requests.post(url=url, headers=headers, data=json.dumps(_data)).text print(res)
text/xml
post请求中,有些请求主体的编码格式为 text/xml,即请求头中content-type 字段对应值为 text/xml,对于这样的接口,我们需要使用xml格式的参数去发送请求。
使用 requests.post() 发送请求参数为xml
格式的post请求时,只需要将xml文件中的body部分写成一个字符串类型就行,遇到换行时在后面加个反斜杠,并将这个字符串赋值给data
参数。代码示例如下:
import requests ''' 请求头的content-type为text/xml ''' def post_text_xml(): headers = {"Content-Type": "text/xml"} url = "http://httpbin.org/post" body = '<?xml version="1.0" encoding = "UTF-8"?>' \ '<COM>' \ '<REQ name="给你一页白纸">' \ '<USER_ID></USER_ID>' \ '<COMMODITY_ID>111111</COMMODITY_ID>' \ '<SESSION_ID>asdfghjklfr0123</SESSION_ID>' \ '</REQ>' \ '</COM>' res = requests.post(url=url, headers=headers, data=body.encode("utf-8")).text print(res) if __name__ == '__main__': post_text_xml()
运行结果如下:
C:\Users\xiaoqq\AppData\Local\Programs\Python\Python37\python.exe E:/blog/python接口自动化/flask_demo/test.py { "args": {}, "data": "<?xml version=\"1.0\" encoding = \"UTF-8\"?><COM><REQ name=\"\u7ed9\u4f60\u4e00\u9875\u767d\u7eb8\"><USER_ID></USER_ID><COMMODITY_ID>111111</COMMODITY_ID><SESSION_ID>asdfghjklfr0123</SESSION_ID></REQ></COM>", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "182", "Content-Type": "text/xml", "Host": "httpbin.org", "User-Agent": "python-requests/2.24.0", "X-Amzn-Trace-Id": "Root=1-6211ebd3-2cc90293777649ba01e50b08" }, "json": null, "origin": "101.71.37.212", "url": "http://httpbin.org/post" } Process finished with exit code 0
总结
这里只介绍了HTTP协议中 GET请求 和 POST请求 常见的请求参数编码格式,怎样确定请求参数的编码格式,以及在python代码中使用requests发送请求时,需要使用怎样格式的参数。
我们总结如下:
- GET请求,请求参数编码格式为query string params,requests.get() 发送请求时使用params参数,params的值 (即请求参数) 为字典格式
- POST请求主体的编码格式需要根据请求头中的content-type字段确定
- content-type: application/x-www-form-urlencoded,requests.post() 发送请求时使用data参数,data的值 (即请求参数) 为字典格式
- content-type: multipart/form-data,requests.post() 发送请求时使用files参数,files的值 (即请求参数) 即为读取的上传文件的内容
- content-type: application/json,requests.post() 发送请求时使用json参数,json的值 (即请求参数) 为字典格式,或者也可以使用 data 参数,但此时需要先将请求参数转换为json格式
- content-type: text/xml,requests.post() 发送请求时使用data参数,data的值 (即请求参数) 为 xml 中的body部分内容
具体的脚本编写方法参考示例代码。