如何发送POST请求?


260

我在网上找到了这个脚本:

import httplib, urllib
params = urllib.urlencode({'number': 12524, 'type': 'issue', 'action': 'show'})
headers = {"Content-type": "application/x-www-form-urlencoded",
            "Accept": "text/plain"}
conn = httplib.HTTPConnection("bugs.python.org")
conn.request("POST", "", params, headers)
response = conn.getresponse()
print response.status, response.reason
302 Found
data = response.read()
data
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
conn.close()

但是我不明白如何在PHP中使用它,或者params变量中的所有内容是什么,或者如何使用它。在尝试使它正常工作时,请给我一点帮助吗?


1
发布请求就是发布请求,无论服务器端是什么。
OndraŽižka'12

7
这将发送POST请求。然后,服务器以302(重定向)标头响应您的POST。到底有什么问题?
ddinchev

1
这个脚本看起来并不python3.2 COMPAT
JDI

相当于此示例的python3可能是:pastebin.com/Rx4yfknM
jdi 2012年

1
我的建议是安装firefox的live http header插件,然后在firefox中打开url并request/responselive http headeraddon中看到url,这比您会理解params and headers代码中的功能要好。
RanRag 2012年

Answers:


388

如果您真的想使用Python处理HTTP,我强烈建议您使用Requests:HTTP for Humans。适应您的问题的POST快速入门是:

>>> import requests
>>> r = requests.post("http://bugs.python.org", data={'number': 12524, 'type': 'issue', 'action': 'show'})
>>> print(r.status_code, r.reason)
200 OK
>>> print(r.text[:300] + '...')

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>
Issue 12524: change httplib docs POST example - Python tracker

</title>
<link rel="shortcut i...
>>> 

我无法获得与您上面相同的结果。我在页面上写了另一个发行号,然后运行脚本,但是在结果上看不到发行号。
EfeBüyük'​​17

2
请更改data = {'number':12524,以读取data = {'number':'12524',。我本人会更改它,但是编辑必须超过6个字符。谢谢
kevthanewversi

2
如何获取json结果?
Yohanes AI

9
如果您需要发送JSON对象,则应该执行以下操作:json={'number': 12524...而不是data=...
Seraf

3
为什么答案说“如果您真的想使用Python处理HTTP”?处理HTTP请求是一个坏主意吗?如果是这样,为什么?谁能解释一下?
Jan Pisl

147

如果您需要脚本具有可移植性,并且不希望有任何第三方依赖关系,那么这就是您纯粹在Python 3中发送POST请求的方式。

from urllib.parse import urlencode
from urllib.request import Request, urlopen

url = 'https://httpbin.org/post' # Set destination URL here
post_fields = {'foo': 'bar'}     # Set POST fields here

request = Request(url, urlencode(post_fields).encode())
json = urlopen(request).read().decode()
print(json)

样本输出:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "foo": "bar"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "7", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.3"
  }, 
  "json": null, 
  "origin": "127.0.0.1", 
  "url": "https://httpbin.org/post"
}

6
就像我在回答中所说的那样,此代码仅在Python 3中有效。
stil

36

您无法使用urllib(仅针对GET)实现POST请求,而是尝试使用requests模块,例如:

范例1.0:

import requests

base_url="www.server.com"
final_url="/{0}/friendly/{1}/url".format(base_url,any_value_here)

payload = {'number': 2, 'value': 1}
response = requests.post(final_url, data=payload)

print(response.text) #TEXT/HTML
print(response.status_code, response.reason) #HTTP

范例1.2:

>>> import requests

>>> payload = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

范例1.3:

>>> import json

>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))

4
谢谢。data = json.dumps(payload)是我的用例的关键
Aram

11

requests通过点击REST API端点,使用库进行GET,POST,PUT或DELETE。在中传递其余api端点url,在中传递url有效载荷(dict),data并在中传递标头/元数据headers

import requests, json

url = "bugs.python.org"

payload = {"number": 12524, 
           "type": "issue", 
           "action": "show"}

header = {"Content-type": "application/x-www-form-urlencoded",
          "Accept": "text/plain"} 

response_decoded_json = requests.post(url, data=payload, headers=header)
response_json = response_decoded_json.json()

print response_json

2
该代码在缩进和标题参数名称方面存在问题。
xilopaint '19

2
headers参数是错误的,而且这里没有json。我们应该使用json.dumps(pauload)
Arash Hatami

感谢@xilopaint和ArashHatami的语法错误。现在已更正。
Pranzell,

3

您的数据字典包含表单输入字段的名称,您只需保持其值正确即可查找结果。 表单视图 页眉将浏览​​器配置为检索您声明的数据类型。使用请求库,可以轻松发送POST:

import requests

url = "https://bugs.python.org"
data = {'@number': 12524, '@type': 'issue', '@action': 'show'}
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept":"text/plain"}
response = requests.post(url, data=data, headers=headers)

print(response.text)

有关请求对象的更多信息:https : //requests.readthedocs.io/en/master/api/


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.