在 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 版本和带有 url http://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 说他们将接受小写的projectnameauthorization。您已将标题命名为 projectNameAuthorization,其中包含大写字母。如果不匹配,则会被拒绝。

【讨论】:

谢谢。我试过了,但我仍然得到同样的错误。 什么错误?请将其发布在您的原始问题中。 谢谢。正如你所指出的,我已经发布了这个问题并更正了语法错误。 我已更新我的答案,以包含有关您的 Access-Control-Allow-Headers 错误的更多详细信息。

以上是关于在 python 请求中包含多个标头的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在XMLHttpRequest标头中包含antiforgerytoken?

强制 Safari 在 jQuery GET 请求中包含 Origin 标头

如何在 Dropzone 上传请求的标头中包含 CSRF 令牌?

如何在 PHP 的 cURL POST HTTP 请求中包含授权标头?

使用 ASP.NET Core 在 POST 请求的标头中包含身份验证

是否可以在 HTTP 标头字段中包含多个 CRLF?