【问题标题】:Include multiple headers in python requests在 python 请求中包含多个标头
【发布时间】: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 的代码。它发回所有标头,然后您可以比较两个版本中的标头
  • 您使用的实际网址是公开的吗?

标签: python python-2.7 curl python-requests


【解决方案1】:
  1. 如果您在发出curl 调用的shell 中定义了$today,并且您没有在requests' 调用URL 中替换它,那么这可能是400 错误请求的原因
  2. Access-Control-* 和其他 CORS 标头与非浏览器客户端无关。此外,HTTP 标头通常不区分大小写。
  3. 按照@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 错误的更多详细信息。
    猜你喜欢
    • 2020-01-19
    • 2019-09-17
    • 1970-01-01
    • 2013-10-27
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2016-11-07
    相关资源
    最近更新 更多