在 python 请求中包含多个标头
Posted
技术标签:
【中文标题】在 python 请求中包含多个标头【英文标题】:Include multiple headers in python requests 【发布时间】:2017-02-24 13:07:09 【问题描述】:我在下面的 curl 中有这个 HTTPS 调用;
header1="projectName: zhikovapp"
header2="Authorization: Bearer HZCdsf="
bl_url="https://BlazerNpymh.com/api/documents?pdfDate=$today"
curl -s -k -H "$header1" -H "$header2" "$bl_url"
我想使用 requests 模块编写一个等效的 python 调用。
header =
"projectName": "zhikovapp",
"Authorization": "Bearer HZCdsf="
response = requests.get(bl_url, headers = header)
但是,请求无效。怎么了?
返回的响应内容是这样的;
<Response [400]>
_content = '"Message":"The request is invalid."'
headers = 'Content-Length': '37', 'Access-Control-Allow-Headers': 'projectname, authorization, Content-Type', 'Expires': '-1', 'cacheControlHeader': 'max-age=604800', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Date': 'Sat, 15 Oct 2016 02:41:13 GMT', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', 'Content-Type': 'application/json; charset=utf-8'
reason = 'Bad Request'
我正在使用 python 2.7
编辑:在 Soviut 指出一些语法错误后,我更正了它们。
【问题讨论】:
你得到了什么结果?我猜你有语法错误。 尝试 curl 版本和带有 urlhttp://httpbin.org/get
的代码。它发回所有标头,然后您可以比较两个版本中的标头
您使用的实际网址是公开的吗?
【参考方案1】:
-
如果您在发出
curl
调用的shell 中定义了$today
,并且您没有在requests
' 调用URL 中替换它,那么这可能是400 错误请求的原因。
Access-Control-*
和其他 CORS 标头与非浏览器客户端无关。此外,HTTP 标头通常不区分大小写。
按照@furas 的建议,输出如下:
$ curl -H "projectName: zhikovapp" -H "Authorization: Bearer HZCdsf=" \
http://httpbin.org/get
"args": ,
"headers":
"Accept": "*/*",
"Authorization": "Bearer HZCdsf=",
"Host": "httpbin.org",
"Projectname": "zhikovapp",
"User-Agent": "curl/7.35.0"
,
"origin": "1.2.3.4",
"url": "http://httpbin.org/get"
与requests
相同的请求:
import requests
res = requests.get('http://httpbin.org/get', headers=
"projectName" : "zhikovapp",
"Authorization" : "Bearer HZCdsf="
)
print(res.json())
'args': ,
'headers':
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, compress',
'Authorization': 'Bearer HZCdsf=',
'Host': 'httpbin.org',
'Projectname': 'zhikovapp',
'User-Agent': 'python-requests/2.2.1 CPython/3.4.3 '
'Linux/3.16.0-38-generic'
,
'origin': '1.2.3.4',
'url': 'http://httpbin.org/get'
如您所见,唯一的区别是 User-Agent
标头。这不太可能是原因,但您可以轻松地将其在 headers
中设置为您喜欢的值。
【讨论】:
【参考方案2】:在request.get()
中,headers
参数应定义为字典,即一组键/值对。您已经定义了一组(唯一的)字符串。
你应该像这样声明你的标题:
headers =
"projectName": "zhikovapp",
"Authorization": "Bearer HZCdsf="
response = requests.get(bl_url, headers=headers)
注意字典中每一行的"key": "value"
格式。
编辑:您的Access-Control-Allow-Headers
说他们将接受小写的projectname
和authorization
。您已将标题命名为 projectName
和 Authorization
,其中包含大写字母。如果不匹配,则会被拒绝。
【讨论】:
谢谢。我试过了,但我仍然得到同样的错误。 什么错误?请将其发布在您的原始问题中。 谢谢。正如你所指出的,我已经发布了这个问题并更正了语法错误。 我已更新我的答案,以包含有关您的Access-Control-Allow-Headers
错误的更多详细信息。以上是关于在 python 请求中包含多个标头的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在XMLHttpRequest标头中包含antiforgerytoken?
强制 Safari 在 jQuery GET 请求中包含 Origin 标头
如何在 Dropzone 上传请求的标头中包含 CSRF 令牌?
如何在 PHP 的 cURL POST HTTP 请求中包含授权标头?