使用Python中的请求发出HTTP POST请求

时间:2017-06-25 12:28:38

标签: python api http post

我正在尝试使用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编写的。

1 个答案:

答案 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中读到的(斜体强调是我的):

  

参数 - (可选)要在请求的查询字符串中发送的字典或字节。
  数据 - (可选)字典或元​​组列表[(键,值)](将采用表单编码),字节或类似文件的对象,以便在正文中发送