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}")