2016-10-15 56 views
3

我在下面卷曲该HTTPS调用包括多个标题;在python请求

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" 

我想写一个等价的使用请求模块的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

编辑:我纠正了一些错误了Syntex指出Soviut出来之后。

+0

你得到什么结果呢?我的猜测是你有一个语法错误。 – Soviut

+2

尝试使用url'http:// httpbin.org/get'来卷曲版本和你的代码。它发回所有标题,然后你可以在两个版本中比较标题 – furas

+0

你使用的是实际的URL吗? –

回答

9

request.get()headers参数应被定义为一个字典,一组键/值对。您已定义了一组字符串(唯一列表)。

你应该声明你的标题是这样的:

headers = { 
    "projectName": "zhikovapp", 
    "Authorization": "Bearer HZCdsf=" 
} 
response = requests.get(bl_url, headers=headers) 

注意的字典里面的每一行的"key": "value"格式。

编辑:您的Access-Control-Allow-Headers表示他们会接受小写的projectnameauthorization。您已将标题projectNameAuthorization命名为大写字母。如果他们不匹配,他们将被拒绝。

+0

谢谢。我尝试过,但我仍然得到相同的错误。 – user781486

+0

什么错误?请将它发布在您的原始问题中。 – Soviut

+0

谢谢。我已经发布了这个问题,正如你指出的那样纠正了语法错误。 – user781486

1
  1. 如果你有在壳体中限定$today您从curl打电话来,你不能代替它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