Python中post请求参数的问题如何解决?

response=requests.post(url=‘http://vip.api.qimingpian.com/h/persons1’,data=form_data,headers=headers)
response=requests.post(url=‘http://vip.api.qimingpian.com/h/persons1’,param=form_data,headers=headers)

这里的 param 和 data 啥区别
Python中post请求参数的问题如何解决?


11 回复

data 是 str,param 是 dict
param = {‘a’:1, ‘b’:2}
data = ‘a=1&b=2’


帖子回复:

遇到Python里POST请求参数传不对的问题,最常见的就是requests.post()datajsonparams这几个参数用混了,或者格式没整对。我直接给你几个典型场景和对应的代码,跑一遍就清楚了。

场景1:发送表单数据(application/x-www-form-urlencoded) 这是最常见的表单提交,用data参数,传个字典就行。requests会自动帮你处理好编码和请求头。

import requests

url = 'https://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}

response = requests.post(url, data=payload)
print(response.json())

场景2:发送JSON数据(application/json) 现在很多API都收JSON。直接用json参数,传个字典(或列表)。库会帮你转成JSON字符串,并设置正确的Content-Type

import requests

url = 'https://httpbin.org/post'
payload = {'name': 'John', 'age': 30, 'city': 'New York'}

response = requests.post(url, json=payload)
print(response.json())

千万别自己用json.dumps()转成字符串再用data传,那样Content-Type不对,很容易出错。

场景3:URL里带查询参数(Query String) 有时候POST请求的URL本身也需要参数,用params

import requests

url = 'https://httpbin.org/post'
params = {'token': 'abc123'}
payload = {'data': 'some data'}

response = requests.post(url, params=params, json=payload)
print(response.url) # 会看到URL后面带了 ?token=abc123
print(response.json())

场景4:需要自定义头信息或复杂格式 遇到刁钻的接口,可能要自己拼字符串、设请求头。

import requests, json

url = 'https://httpbin.org/post'
# 比如非要一个非标准的JSON格式(虽然不常见)
custom_data = json.dumps({'query': 'special'}, separators=(',', ':'))
headers = {'Content-Type': 'application/json', 'X-Custom-Header': 'MyValue'}

response = requests.post(url, data=custom_data, headers=headers)
print(response.json())

怎么快速定位问题?

  1. 先看请求头:特别是Content-Type对不对。用response.request.headers可以查看实际发出的请求头。
  2. 对比成功和失败的请求:用浏览器开发者工具或抓包工具(如Fiddler、Charles)抓一个能成功的请求,看看它的参数格式、编码,然后在你代码里完全复现。
  3. 打印调试信息
    r = requests.post(...)
    print('Request Headers:', r.request.headers)
    print('Request Body:', r.request.body)
    print('Response Status Code:', r.status_code)
    print('Response Text:', r.text)
    

总结:九成问题出在没分清datajson参数,或者请求头不对。

一句话建议:明确接口要什么格式,选对datajson参数,拿不准就抓包对比。

你可以这样理解,

param 出现在 URL 地址上,

data 不出现。

出现在 url 地址上直接 get 不就可以了


一个网站的 Form_data post 参数是这样的,那我是传 Data 还是 param ?因为你这样看也不知道是 dict 还是 str
page: 1
num: 50
w:
ptype: qmp_pc
version: 2.0
unionid: ETXncbCRyisjw/hr0zeTaonhpvkz/81ntwbBWAKYE4wdmhbtHCwxkjwb+0gjVdRzeJWqqIs6kiQsM8IbOYgM5A==
jtype: vip
time_token: 1532254367533

params 的内容会带在 url 后面,作为 query string, 比如 https://www.baidu.com?xxx=yyy&aaa=bbb

能用搜索引擎搜索到的问题为什么要提个问题呢?

https://stackoverflow.com/a/24535938/4614538

params 是往 url 后面添加参数。

param: url 参数
data: 表单
json: json
都传字典进去

params 是 url ?后那种; data 是 form 表单、file 类,在请求的 body 中。

多谢指正。

你的问题 说的很清楚。

回到顶部