有没有办法在python中进行HTTP PUT

时间:2008-09-21 20:11:06

标签: python http put

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

14 个答案:

答案 0 :(得分:298)

我过去使用过各种python HTTP库,我已经确定了'Requests'作为我的最爱。现有的libs具有相当可用的接口,但是对于简单的操作,代码最终可能只有几行。请求中的基本PUT如下所示:

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

然后,您可以使用以下方法检查响应状态代码:

r.status_code

或回复:

r.content

请求有很多共同的糖和快捷方式,可以让你的生活更轻松。

答案 1 :(得分:240)

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)

答案 2 :(得分:46)

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

答案 3 :(得分:8)

你应该看一下httplib module。它应该让你做出你想要的任何类型的HTTP请求。

答案 4 :(得分:8)

我需要在一段时间内解决这个问题,以便我可以充当RESTful API的客户端。我决定使用httplib2,因为它允许我除了GET和POST之外还发送PUT和DELETE。 Httplib2不是标准库的一部分,但您可以从奶酪店轻松获取它。

答案 5 :(得分:8)

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

pip install requests

更多关于installing requests

然后设置put请求:

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)

请参阅quickstart for requests library。我认为这比urllib2简单得多,但是需要安装和导入这个额外的包。

答案 6 :(得分:7)

这在python3中做得更好,并记录在the stdlib documentation

method=...类在python3中获得了req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT') urllib.request.urlopen(req) 参数。

一些示例用法:

componentDidMount

答案 7 :(得分:6)

我还建议Joe Gregario httplib2。我在标准库中经常使用它而不是httplib。

答案 8 :(得分:3)

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

答案 9 :(得分:2)

您当然可以使用现有的标准库从套接字到调整urllib,从而使用现有的标准库。

http://pycurl.sourceforge.net/

“PyCurl是libcurl的Python接口。”

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

“PycURL的主要缺点是它是一个比libcurl更薄的层而没有任何好的Pythonic类层次结构。这意味着它有一些陡峭的学习曲线,除非你已经熟悉libcurl的C API。”

答案 10 :(得分:2)

如果您想留在标准库中,可以继承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)

答案 11 :(得分:0)

使用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请求中存在错误,则会引发异常。

答案 12 :(得分:0)

使用urllib3

为此,您将需要在URL中手动编码查询参数。

FROM alpine:latest
ENV http_proxy=http://proxyserver:9000
ENV https_proxy=http://proxyserver:9000
RUN ( apk fix --no-cache || echo "cannot fix." )
RUN ( apk upgrade --no-cache || echo "cannot upgrade." )
RUN apk add --no-cache --update --upgrade openjdk8
COPY build/libs/my-docker-service.jar /opt/app/
COPY config/application.yml /opt/app/config/
ENTRYPOINT ["java","-jar", "/opt/app/my-docker-service.jar", "--spring.config.location=/opt/app/config/application.yml"]

使用requests

>>> 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.'}

答案 13 :(得分:0)

您可以使用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)