有没有办法在 Python 中执行 HTTP PUT 请求?

2025-04-15 09:18:00
admin
原创
27
摘要:问题描述:我需要使用 Python 中的 HTTP 方法将一些数据上传到服务器PUT。根据我对文档的简单阅读urllib2,它只支持 HTTP POST。PUT有没有办法用 Python来执行 HTTP ?解决方案 1:我以前用过各种各样的 Python HTTP 库,最终选择了Requests作为我的最爱。...

问题描述:

我需要使用 Python 中的 HTTP 方法将一些数据上传到服务器PUT。根据我对文档的简单阅读urllib2,它只支持 HTTP POST

PUT有没有办法用 Python来执行 HTTP ?


解决方案 1:

我以前用过各种各样的 Python HTTP 库,最终选择了Requests作为我的最爱。现有的库虽然接口相当好用,但代码对于简单的操作来说可能会冗长几行。Requests 中一个基本的 PUT 操作如下:

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

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

r.status_code

或者响应如下:

r.content

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

解决方案 2:

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)

解决方案 3:

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

解决方案 4:

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

pip install 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)

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

解决方案 5:

这在 python3 中得到了改进,并在stdlib 文档中进行了记录

该类在python3中urllib.request.Request增加了一个method=...参数。

一些示例用法:

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

解决方案 6:

你应该看看httplib 模块。它应该能让你发出任何类型的 HTTP 请求。

解决方案 7:

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

解决方案 8:

我还推荐Joe Gregario 的httplib2。我经常用它来代替标准库中的 httplib。

解决方案 9:

你看过put.py了吗?我以前用过。你也可以用 urllib 来修改你自己的请求。

解决方案 10:

当然,您可以使用任何级别的现有标准库(从套接字到调整 urllib)来开发自己的库。

http://pycurl.sourceforge.net/

“PyCurl 是 libcurl 的 Python 接口。”

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

PycURL 的主要缺点是,它与 libcurl 的层级结构相对较薄,缺乏那些简洁的 Python 式类层次结构。这意味着,除非你已经熟悉 libcurl 的 C API,否则它的学习曲线会比较陡峭。

解决方案 11:

如果您想要保留标准库,您可以将其子类化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)

解决方案 12:

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

解决方案 13:

更合适的做法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 请求中出现错误,则会引发异常。

解决方案 14:

使用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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用