2

我正在尝试通过 Python 2.7 的 urllib2 模块发出 put 请求。当我执行 GET 时,它工作得很好,但是当我尝试将它变成 PUT 时,它返回一个 301 http 错误。我的代码在上面:

opener = urllib2.build_opener(urllib2.HTTPHandler)
req = urllib2.Request(reqUrl)
base64string = base64.encodestring('%s:%s' % (v_username, v_password)).replace('\n', '')
req.add_header("Authorization", "Basic %s" % base64string)
req.add_header("Content-Type", "application/rdf+xml")
req.add_header("Accept", "application/rdf+xml")
req.add_header("OSLC-Core-Version", "2.0")
req.get_method = lambda: 'PUT'
req.allow_redirects=True
url = opener.open(req)

如果我压制这条线

req.get_method = lambda: 'PUT'

它有效,但它是一个获取请求(如果我传递一些数据,它是一个帖子),但它必须是一个 PUT,我不知道如何用这个模块做不同的事情。

错误是

urllib2.HTTPError: HTTP Error 301: Moved Permanently.

有没有人比我更了解这一点?我是一个 REST 请求的新手,有些特殊性对我来说仍然是模糊的。

4

2 回答 2

2

我不确定,但可能是 urllib 自动为 GET 处理 301 而不是为 PUT 处理?根据RFC,用户代理可以自动重定向 GET,但不能重定向 PUT。

该页面似乎表明 urllib 确实确实自动处理了 301 重定向,并且在给定 RFC 的情况下它不会自动处理 PUT 重定向似乎是合理的。猜猜你应该找出重定向是什么并重定向到那里。

于 2013-11-15T11:44:09.033 回答
0

谢谢 Ken F,你帮助我理解了这个问题。我直接在 urllib2.py 文件中更改了处理程序(不确定它是否非常干净,但无论如何),因此它可以处理 PUT 请求:

if (code in (301, 302, 303, 307) and m in ("GET", "HEAD")
            or code in (301, 302, 303) and m in ("POST", "PUT")):

事实上,当请求既不是 GET 也不是 POST 时,它会自动引发错误。我很惊讶我找不到其他有同样问题的人。

于 2013-11-15T13:07:21.637 回答