使用Python requests模块获取HTTP响应头

4
我正在使用Python中的“requests”模块查询RESTful API端点。有时,端点会返回HTTP错误500。我知道可以使用requests.status_code获取状态码,但当我遇到500错误时,我想查看HTTP“响应文本”(我不确定它叫什么,下面是一些示例)。到目前为止,我已经能够使用response.headers获取一些标头。然而,我要寻找的信息还没有出现。
使用“curl -vvv”,我可以看到我需要的HTTP响应(为了清晰起见省略了一些输出):
< HTTP/1.1 200 OK <---------------------this is what I'm after)
* Server nginx/1.4.1 is not blacklisted
< Server: nginx/1.4.1
< Date: Wed, 05 Feb 2014 16:13:25 GMT
< Content-Type: application/octet-stream
< Connection: close
< Set-Cookie: webapp.session.id="mYzk5NTc0MDZkYjcxZjU4NmM=|1391616805|f83c47a363194c1ae18e"; expires=Fri, 07 Mar 2014 16:13:25 GMT; Path=/
< Content-Disposition: attachment; filename = "download_2014161325.pdf"
< Cache-Control: public

这是从curl获取的信息。现在,当我使用Python的requests模块并请求headers时,我只会得到如下信息:

CaseInsensitiveDict(
 {
  'date': 'Tue, 04 Feb 2014 21:56:45 GMT',
  'set-cookie': 'webapp.session.id="xODgzNThlODkzZ2U0ZTg=|1391551005|a11ca2ad11195351f636fef"; expires=Thu, 06 Mar 2014 21:56:45 GMT; Path=/, 
  'connection': 'close',
  'content-type': 'application/json',
  'server': 'nginx/1.4.1'
 }
)

注意到curl响应中包含"HTTP/1.1 200 OK",但requests.headers没有。 响应头中几乎所有其他内容都在那里。 requests.status_code给了我200。 在这个例子中,我只关心“OK”。 在其他情况下,我们的nginx服务器返回更详细的消息,例如“HTTP/1.1 500搜索不可用”或“HTTP/1.1 500参数错误”等。 我想得到这个文本。 有没有办法或者我可以用Popen和curl来黑一些东西?Requests.content和requests.text没有帮助。
2个回答

9
你正在寻找 Response.reason 属性
>>> import requests
>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200
>>> r.reason
'OK'
>>> r = requests.get('http://httpbin.org/status/500')
>>> r.reason
'INTERNAL SERVER ERROR'

3

这是一个很好的答案,但请记住,在某些应用程序中,您需要检索响应头。这在分页式REST API中经常发生。可以使用以下命令来检索它们:

r.headers

使用以下代码迭代键:

[x for x in r.headers]

愉快的编码! [R]



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接