使用Python urllib2进行PUT

时间:2014-01-20 20:46:19

标签: python urllib2

我正在尝试按照我在stackoverflow上找到的示例使用urllib2进行PUT到REST:

Is there any way to do HTTP PUT in python

我不明白为什么我会收到错误错误。

以下是我的代码的摘录:

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()

如果我删除PUT选项我试图设置然后它发布它找到但当我尝试将get_method设置为PUT时它会出错。

为了确保REST服务不会导致我尝试使用cURL执行PUT的问题,并且它工作正常。

3 个答案:

答案 0 :(得分:6)

正如其他人所说,requests是一个很棒的图书馆。但是,如果您处于无法使用requests的情况(比如安全模块开发或类似),还有另一种方式,如this gist的作者所示:

import urllib2

class MethodRequest(urllib2.Request):
    def __init__(self, *args, **kwargs):
        if 'method' in kwargs:
            self._method = kwargs['method']
            del kwargs['method']
        else:
            self._method = None
        return urllib2.Request.__init__(self, *args, **kwargs)

    def get_method(self, *args, **kwargs):
        if self._method is not None:
            return self._method
        return urllib2.Request.get_method(self, *args, **kwargs)

用法:

>>> req = MethodRequest(url, method='PUT')

答案 1 :(得分:4)

虽然aaronfay的答案很好并且有效,但我认为鉴于除了GET之外只有3种HTTP方法(并且你只担心PUT),只需定义Request sub就更清晰,更简单 - 每种方法的类。

例如:

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

    def __init__(self, *args, **kwargs):
        return urllib2.Request.__init__(self, *args, **kwargs)

    def get_method(self, *args, **kwargs):
        return 'PUT'

然后使用:

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

答案 2 :(得分:1)

尝试使用:

import urllib

data=urllib.urlencode(jsonObj)

而不是json.dumps。它对我有用。