我正在将Python 3.7与urllib一起使用。一切正常,但在收到http重定向请求时似乎并没有进行自动重定向(307)。
这是我得到的错误:
ERROR 2020-06-15 10:25:06,968 HTTP Error 307: Temporary Redirect
我必须使用try-except处理它,然后手动将另一个请求发送到新位置:它工作正常,但我不喜欢它。
这是我用来执行请求的一段代码:
req = urllib.request.Request(url)
req.add_header('Authorization', auth)
req.add_header('Content-Type','application/json; charset=utf-8')
req.data=jdati
self.logger.debug(req.headers)
self.logger.info(req.data)
resp = urllib.request.urlopen(req)
URL是一个https资源,我设置了带有某些Authorization info e内容类型的标头。req.data是JSON
从urllib文档中,我已经发现重定向本身是由库本身以合法方式执行的,但是对我而言它不起作用。它始终会引发http 307错误,并且不遵循重定向URL。我也尝试过使用默认默认重定向处理程序的开启程序,但结果相同
opener = urllib.request.build_opener(urllib.request.HTTPRedirectHandler)
req = urllib.request.Request(url)
req.add_header('Authorization', auth)
req.add_header('Content-Type','application/json; charset=utf-8')
req.data=jdati
resp = opener.open(req)
可能是什么问题?
您未在评论部分的讨论中正确确定了不自动完成重定向的原因。具体来说,RFC 2617, Section 10.3.8指出:
如果响应其他请求而收到307状态代码 而不是GET或HEAD,用户代理不得自动重定向 请求,除非可以被用户确认,因为这可能 更改发出请求的条件。
返回问题-给定data
,这将自动导致get_method
返回POST
(根据how this method was implemented),并且由于请求方法为POST
,并且响应代码为307
时,按照上述说明,将引发HTTPError
。在Python的urllib
上下文中,this specific section模块的urllib.request
引发了异常。
为了进行实验,请尝试以下代码:
import urllib.request
import urllib.parse
url = 'http://httpbin.org/status/307'
req = urllib.request.Request(url)
req.data = b'hello' # comment out to not trigger manual redirect handling
try:
resp = urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
redirected_url = urllib.parse.urljoin(url, e.headers['Location'])
resp = urllib.request.urlopen(redirected_url)
print('Redirected -> %s' % redirected_url) # the original redirected url
print('Response URL -> %s ' % resp.url) # the final url
按原样运行代码可能会产生以下结果
Redirected -> http://httpbin.org/redirect/1
Response URL -> http://httpbin.org/get
请注意,随后的重定向到get
是自动完成的,因为随后的请求是GET
请求。注释掉req.data
分配行将导致缺少“重定向”输出行。
此外,出于兴趣(出于链接目的),这个特定的问题之前已经被问过多次,而令他们惊讶的是,他们没有得到任何答案,这使我感到很惊讶: