使用Python urllib2进行PUT
我正试图使用urllib2来实现REST,下面是我在stackoverflow上找到的示例: 我不明白为什么我会出错 以下是我的代码摘录:使用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-
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)