Включить несколько заголовков в запросы python

#python #python-2.7 #curl #python-requests

#python #python-2.7 #curl #python-запросы

Вопрос:

У меня есть этот HTTPS-вызов в curl ниже;

 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 с использованием модуля requests.

 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 после того, как Совиут указал на них.

Комментарии:

1. Какой результат вы получили? Я предполагаю, что у вас синтаксическая ошибка.

2. попробуйте версию curl и ваш код с url http://httpbin.org/get . Он отправляет обратно все заголовки, а затем вы можете сравнить заголовки в обеих версиях

3. Является ли фактический URL-адрес, который вы используете, общедоступным?

Ответ №1:

В 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 указали в них прописные буквы. Если они не совпадают, они будут отклонены.

Комментарии:

1. Спасибо. Я пробовал это, но все равно получаю ту же ошибку.

2. Какая ошибка? Пожалуйста, опубликуйте это в своем первоначальном вопросе.

3. Спасибо. Я опубликовал вопрос и исправил синтаксическую ошибку, как вы указали.

4. Я обновил свой ответ, чтобы включить более подробную информацию о вашей Access-Control-Allow-Headers ошибке.

Ответ №2:

  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 значение, которое вам нравится.