![](/img/trans.png)
[英]Is there any way to put a variable inside telnet command in python?
[英]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.