【问题标题】:Python : urllib2 put request returns 301 errorPython:urllib2 put 请求返回 301 错误
【发布时间】:2013-11-15 10:21:54
【问题描述】:

我正在尝试通过 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 请求的新手,有些特殊性对我来说仍然是模糊的。

【问题讨论】:

    标签: python-2.7 urllib2 http-status-code-301 put


    【解决方案1】:

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

    This page 似乎表明 urllib 确实会自动处理 301 重定向,而且鉴于 RFC,它不会自动处理 PUT 重定向似乎是合理的。猜猜你应该找出重定向是什么并重定向到那里。

    【讨论】:

      【解决方案2】:

      感谢 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 时,它会自动引发错误。我很惊讶我找不到其他人遇到同样的问题。

      【讨论】:

        猜你喜欢
        • 2019-07-28
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多