AJAX Post请求中常用的两种传参数的形式:form data 和 request payload
如果一个请求的Content-Type设置为application/x-www-form-urlencoded,那么这个Post请求会被认为是Http Post表单请求,那么请求主体将以一个标准的键值对和&的querystring形式出现。这种方式是HTML表单的默认设置,所以在过去这种方式更加常见。
其他形式的POST请求,是放到 Request payload 中(现在是为了方便阅读,使用了Json这样的数据格式),请求的Content-Type设置为application/json;charset=UTF-8或者不指定。
遇到Request Payload的解决办法
官方提供了两种方法让我们以 application/json 格式编码数据进行传输。
1.使用json.dumps()方法
json.dumps()方法将字典数据转化成json类型然后传给data参数,代码如下:
import requests
import json
headers = {
'Content-Type': 'application/json',
......
}
data = {
"n": "测试logo",
"s": "TEST LOGO",
"descr": "this is demo",
"data": [],
"p": 1,
"dataPage": 0,
"icon_lists": [],
"icon_page": 1
}
url = 'https://www.logosc.cn/api/getAllInfo'
response = requests.post(url=url, data=json.dumps(data), headers=headers)
print(response.json())
2.将数据传给json参数
requests.post方法里有个json参数,当我们把数据传给json参数时,Content-Type会被自动的设置成application/json,代码如下:
import requests
headers = {
'Content-Type': 'application/json',
......
}
data = {
"n": "测试logo",
"s": "TEST LOGO",
"descr": "this is demo",
"data": [],
"p": 1,
"dataPage": 0,
"icon_lists": [],
"icon_page": 1
}
url = 'https://www.logosc.cn/api/getAllInfo'
response = requests.post(url=url, json=data, headers=headers)
print(response.json())
3.演示:使用requests模块post payload请求
mport json
import requests
import datetime
postUrl = 'https://sellercentral.amazon.com/fba/profitabilitycalculator/getafnfee?profitcalcToken=en2kXFaY81m513NydhTZ9sdb6hoj3D'
# payloadData数据
payloadData = {
'afnPriceStr': 10,
'currency':'USD',
'productInfoMapping': {
'asin': 'B072JW3Z6L',
'dimensionUnit': 'inches',
}
}
# 请求头设置
payloadHeader = {
'Host': 'sellercentral.amazon.com',
'Content-Type': 'application/json',
}
# 下载超时
timeOut = 25
# 代理
proxy = "183.12.50.118:8080"
proxies = {
"http": proxy,
"https": proxy,
}
r = requests.post(postUrl, data=json.dumps(payloadData), headers=payloadHeader)
dumpJsonData = json.dumps(payloadData)
print(f"dumpJsonData = {dumpJsonData}")
res = requests.post(postUrl, data=dumpJsonData, headers=payloadHeader, timeout=timeOut, proxies=proxies, allow_redirects=True)
# 下面这种直接填充json参数的方式也OK
# res = requests.post(postUrl, json=payloadData, headers=header)
print(f"responseTime = {datetime.datetime.now()}, statusCode = {res.status_code}, res text = {res.text}")