首页 文章

如何发送POST请求?

提问于
浏览
192

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

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变量内的所有内容或如何使用它 . 试着让它发挥作用,我可以请一点帮助吗?

4 回答

  • 109

    如果你真的想用Python处理HTTP,我强烈推荐Requests: HTTP for Humans . POST quickstart适应了你的问题是:

    >>> 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...
    >>>
    
  • 26

    如果你需要你的脚本是可移植的,而你宁愿没有任何第三方依赖,那么这就是你纯粹在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"
    }
    
  • 276

    您无法使用 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))
    
  • 0

    通过命中REST API endpoints ,使用 requests 库进行GET,POST,PUT或DELETE . 传递 url 中的其余api endpoints url, data 中的payload(dict)和 headers 中的header / metadata

    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=head)
     response_json = response_decoded_json.json()
    
     print response_json
    

相关问题