#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:
- Если вы
$today
определили в оболочке, из которой выполняетеcurl
вызов, и не подставляете его в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
значение, которое вам нравится.