使用Python urllib2进行PUT

使用Python urllib2进行PUT,python,urllib2,Python,Urllib2,我正试图使用urllib2来实现REST,下面是我在stackoverflow上找到的示例: 我不明白为什么我会出错 以下是我的代码摘录: import urllib2 import json content_header = {'Content-type':'application/json', 'Accept':'application/vnd.error+json,application/json', 'Accept-

我正试图使用urllib2来实现REST,下面是我在stackoverflow上找到的示例:

我不明白为什么我会出错

以下是我的代码摘录:

import urllib2
import json

content_header = {'Content-type':'application/json',
                 'Accept':'application/vnd.error+json,application/json',
                 'Accept-Version':'1.0'}

baseURL = "http://some/put/url/"


f = open("somefile","r")
data = json.loads(f.read())

request = urllib2.Request(url=baseURL, data=json.dumps(jsonObj), headers=content_header)
request.get_method = lambda: 'PUT' #if I remove this line then the POST works fine.

response = urllib2.urlopen(request)

print response.read()
如果我删除了我试图设置的看跌期权,那么它会发布find,但当我尝试将get_方法设置为PUT时,它会出错


为了确保REST服务不会引起问题,我尝试使用cURL进行PUT,效果很好

正如其他人所指出的,
请求
是一个非常棒的库。但是,如果您处于无法使用
请求
的情况下(例如ansible模块开发或类似),则有另一种方法,如以下作者所示:

用法:

>>> req = MethodRequest(url, method='PUT')
尝试使用:

import urllib

data=urllib.urlencode(jsonObj)

而不是
json.dumps
。这对我来说很有用。

虽然aaronfay的答案很好而且有效,但我认为,考虑到除了GET之外只有3种HTTP方法(您只担心PUT),只需为每个方法定义请求子类就更清晰、更简单了

例如:

class PutRequest(urllib2.Request):
    '''class to handling putting with urllib2'''

    def get_method(self, *args, **kwargs):
        return 'PUT'
然后使用:

request = PutRequest(url, data=json.dumps(data), headers=content_header)

您的异常的完整回溯是什么?如果您不担心安装新的Python库,则可以处理
PUT
,而无需额外的破解,并且更易于使用。FWIW我强烈建议对Python中的任何HTTP内容使用
requests
库。内置HTTP客户端功能的API不好。不过,正如你的问题所指出的那样,这并不等于一个答案。
urllib2
。我同意
请求的第三个建议
我必须同意请求让生活变得更容易。URL编码和JSON编码是根本不同的事情,编码(URL编码与JSON)与HTTP方法(POST与PUT)是正交的如果子类实现只调用超类实现,则无需重写子类中的任何方法(在本例中为
\uuuu init\uuu
)(要求)
request = PutRequest(url, data=json.dumps(data), headers=content_header)