繁体   English   中英

有什么办法可以在 python 中执行 HTTP PUT

[英]Is there any way to do HTTP PUT in python

我需要在 python 中使用 HTTP PUT将一些数据上传到服务器。 从我对 urllib2 文档的简要阅读来看,它只执行 HTTP POST 有什么办法可以在 python 中执行 HTTP PUT

我过去使用过各种 python HTTP 库,我最喜欢的是requests 现有的库有非常有用的接口,但代码最终可能会变得太长而无法进行简单的操作。 请求中的基本 PUT 如下所示:

payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)

然后您可以检查响应状态代码:

r.status_code

或响应:

r.content

Requests 有很多语法糖和快捷方式,可以让您的生活更轻松。

import urllib2
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request('http://example.org', data='your_put_data')
request.add_header('Content-Type', 'your/contenttype')
request.get_method = lambda: 'PUT'
url = opener.open(request)

Httplib 似乎是一个更简洁的选择。

import httplib
connection =  httplib.HTTPConnection('1.2.3.4:1234')
body_content = 'BODY CONTENT GOES HERE'
connection.request('PUT', '/url/path/to/put/to', body_content)
result = connection.getresponse()
# Now result.status and result.reason contains interesting stuff

您可以使用请求库,与采用 urllib2 方法相比,它简化了很多事情。 首先从 pip 安装它:

pip install requests

有关安装请求的更多信息。

然后设置放置请求:

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

# Create your header as required
headers = {"content-type": "application/json", "Authorization": "<auth-key>" }

r = requests.put(url, data=json.dumps(payload), headers=headers)

请参阅请求库的快速入门 我认为这比 urllib2 简单得多,但确实需要安装和导入这个额外的包。

这在 python3 中做得更好,并记录在stdlib 文档

urllib.request.Request类在 python3 中获得了一个method=...参数。

一些示例用法:

req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)

您应该看看httplib 模块 它应该允许您发出任何类型的 HTTP 请求。

不久前我也需要解决这个问题,这样我才能充当 RESTful API 的客户端。 我选择了 httplib2,因为除了 GET 和 POST 之外,它还允许我发送 PUT 和 DELETE。 Httplib2 不是标准库的一部分,但您可以从奶酪店轻松获得它。

我还推荐 Joe Gregario 的httplib2 我经常使用它而不是标准库中的 httplib。

你看过put.py了吗? 我过去用过它。 您也可以使用 urllib 破解您自己的请求。

您当然可以在从套接字到调整 urllib 的任何级别上使用现有的标准库来滚动自己的库。

http://pycurl.sourceforge.net/

“PyCurl 是 libcurl 的 Python 接口。”

“libcurl 是一个免费且易于使用的客户端 URL 传输库,...支持...HTTP PUT”

“PycURL 的主要缺点是它是 libcurl 之上的一个相对较薄的层,没有任何那些漂亮的 Pythonic 类层次结构。这意味着它的学习曲线有点陡峭,除非您已经熟悉 libcurl 的 C API。”

如果你想留在标准库中,你可以urllib2.Request

import urllib2

class RequestWithMethod(urllib2.Request):
    def __init__(self, *args, **kwargs):
        self._method = kwargs.pop('method', None)
        urllib2.Request.__init__(self, *args, **kwargs)

    def get_method(self):
        return self._method if self._method else super(RequestWithMethod, self).get_method()


def put_request(url, data):
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    request = RequestWithMethod(url, method='PUT', data=data)
    return opener.open(request)

你可以使用requests.request

import requests

url = "https://www.example/com/some/url/"
payload="{\"param1\": 1, \"param1\": 2}"
headers = {
  'Authorization': '....',
  'Content-Type': 'application/json'
}

response = requests.request("PUT", url, headers=headers, data=payload)

print(response.text)

requests执行此操作的更正确方法是:

import requests

payload = {'username': 'bob', 'email': 'bob@bob.com'}

try:
    response = requests.put(url="http://somedomain.org/endpoint", data=payload)
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(e)
    raise

如果 HTTP PUT 请求中存在错误,则会引发异常。

使用urllib3

为此,您需要手动对 URL 中的查询参数进行编码。

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> from urllib.parse import urlencode
>>> encoded_args = urlencode({"name":"Zion","salary":"1123","age":"23"})
>>> url = 'http://dummy.restapiexample.com/api/v1/update/15410' + encoded_args
>>> r = http.request('PUT', url)
>>> import json
>>> json.loads(r.data.decode('utf-8'))
{'status': 'success', 'data': [], 'message': 'Successfully! Record has been updated.'}

使用requests

>>> import requests
>>> r = requests.put('https://httpbin.org/put', data = {'key':'value'})
>>> r.status_code
200

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM