我正在尝试使用POST方法向API发出HTTP请求。我正在使用的API意味着接受三个参数(key1,key2,key3)并返回一个json文件。不幸的是,当我使用数据方法将我的字典传递给API时,我的POST请求似乎没有返回任何内容。这似乎很奇怪,因为它似乎在我使用 params 方法时起作用。我无法理解这一点,因为这个过程似乎非常不透明(例如,我无法通过URL查看有效负载如何传递到API)。
我的问题:我在这里做错了什么?
使用数据方法将参数发送到API的POST请求:
import requests
url = 'http://example.com/API.php'
payload = {
'key1': '<<Contains very long json string>>',
'key2': 5,
'key3': 0
}
print len(str(payload)) # Prints 6717
r = requests.post(url, data=payload) << Note data is used here
print r.status_code # Prints 200
print r.text # Prints empty string
POST请求代码,使用参数方法将参数发送到API:
import requests
url = 'http://example.com/API.php'
payload = {
'key1': '<<Contains very long json string>>',
'key2': 5,
'key3': 0
}
print len(str(payload)) # Prints 6717
r = requests.post(url, params=payload) << Note here params is used here
print r.status_code # Prints 200
print r.text # Prints expected JSON results
如果您想知道为什么我想在参数上使用数据方法...我试图传递包含更长字符串的其他词典和 params 方法似乎没有这样做,因为我得到 ERROR 414 。我希望使用数据来解决错误。
我使用的API是用PHP编写的。
答案 0 :(得分:1)
简短回答
这是因为params将参数作为http POST请求的一部分发送,而数据将它们作为请求主体的一部分发送。在你的情况下:只需使用params调用api,你就可以了。这绝对是正常的(和预期的)行为。
<强>示范强>
只需启动两个命令行。首先,运行netcat:nc -l 8888
。在另一个命令行上,运行python:
>>> import requests
>>> requests.post('http://localhost:8888',data={'a':1,'b':'2'})
在netcat端,我们看到以下请求:
POST / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.18.1
Content-Length: 7
Content-Type: application/x-www-form-urlencoded
a=1&b=2
接下来,试试params方式:
>>> requests.post('http://localhost:8888',params={'a':1,'b':'2'})
Netcat报道:
POST /?a=1&b=2 HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.18.1
Content-Length: 0
注意第一行和最后一行的差异。
正如您可以从documentation中读到的(斜体强调是我的):
参数 - (可选)要在请求的查询字符串中发送的字典或字节。
数据 - (可选)字典或元组列表[(键,值)](将采用表单编码),字节或类似文件的对象,以便在正文中发送 请求的em>。