今天研究一個接口,post請求,application/x-www-form-urlencoded格式 --表單形式提交
1、application/x-www-form-urlencoded
1)瀏覽器的原生form表單
2) 提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key和val都進行了URL轉碼
POST [http://www.example.com](http://www.example.com) HTTP/1.1 Content-Type: application/x-[www-form-urlencoded](http://www-form-urlencoded);charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
2. 接口相關內容:

fiddler抓包,
postman正常請求成功,fiddler抓包,參數如上所示;raw 中可看到,已 進行了 轉碼
python代碼如下:
urlq = "http://xx.xx.xx.xxx:xxxx/ncmisservice/contract/creditContract/callbackYZ"
headers = {"Content-Type":"application/x-www-form-urlencoded"}
data = {
"serno": "10000320042201578",
"prdCode": "YGYZD",
"contracts": [{
"pdfFileId": "b4f1b909ba4711e982ec00163e0cdd78",
"signDt": "2019-08-26 15:18:22",
"contractName": "xxxx授信合同",
"contNo": "30010320042201133",
"contTyp": "01"
}],
"legalInfo": {
"legalPhone": "15810145528",
"openingBank": "招商銀行",
"cardNumber": "23423423647",
"bankMobileNumber": "15810145528"
}
}
data['serno'] = '10000320120338114'
data['contracts'][0]['contNo'] = '3'
#youzanShouxinContract = json.dumps(youzanShouxinContract)
redata = {
"serviceId":'contractsInfo',
"data": data
}
redata = json.dumps(redata) #dict 轉成 json
print(type(redata),redata)
re = requests.post(url=urlq, headers=headers, data=redata)
但是發現不通。通過fiddler抓包,參數如下:

代碼一直不通,一直給錯誤提示,如下:
一直在提示 必填字符data 不存在。無論是將data單獨轉成json 字符串,還是redata整體轉成json 字符串,都不行。
知識點:dict 字典轉json字符串:redata = json.dumps(redata)
后來,終於找到了一種可以的。 redata整體進行轉義:redata = urlencode(redata) ---關鍵點
代碼如下:
from urllib.parse import urlencode
urlq = "http://xx.xx.xx.xxx:xxxx/ncmisservice/contract/creditContract/callbackYZ"
headers = {"Content-Type":"application/x-www-form-urlencoded"}
data = {
"serno": "10000320042201578",
"prdCode": "YGYZD",
"contracts": [{
"pdfFileId": "b4f1b909ba4711e982ec00163e0cdd78",
"signDt": "2019-08-26 15:18:22",
"contractName": "xxxx貸授信合同",
"contNo": "30010320042201133",
"contTyp": "01"
}],
"legalInfo": {
"legalPhone": "15810145528",
"openingBank": "招商銀行",
"cardNumber": "23423423647",
"bankMobileNumber": "15810145528"
}
}
data['serno'] = '10000320120338114'
data['contracts'][0]['contNo'] = '3'
redata = {
"serviceId":'contractsInfo',
"data": data
}
redata = urlencode(redata) #key關鍵點
print(type(redata),redata)
re = requests.post(url=urlq, headers=headers, data=redata)
python代碼再次運行,成功。
關鍵點:表單提交,即application/x-www-form-urlencoded 這種請求方式,
表單提交的數據,按照key1=val1&key2=val2 的方式進行編碼,
key和val都進行 URL轉碼。
redata = urlencode(redata)