Я пытаюсь сделать запрос API POST, используя библиотеку запросов Python. Я передаю Authorization
заголовок, но когда я пытаюсь отладить, я вижу, что заголовок удаляется. Я понятия не имею, что происходит.
Вот мой код:
access_token = get_access_token()
bearer_token = base64.b64encode(bytes("'Bearer {}'".format(access_token)), 'utf-8')
headers = {'Content-Type': 'application/json', 'Authorization': bearer_token}
data = '{"FirstName" : "Jane", "LastName" : "Smith"}'
response = requests.post('https://myserver.com/endpoint', headers=headers, data=data)
Как вы можете видеть выше, я вручную установить Authorization
заголовок в аргументах запроса, но отсутствуют на заголовки фактического запроса в:
{'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.4.3 CPython/2.7.9 Linux/4.1.19-v7+'}
.
Дополнительная информация заключается в том, что если я изменю запрос POST на запрос GET, Authorization
заголовок проходит нормально!
Почему эта библиотека отбрасывает заголовок для запросов POST и как мне заставить это работать?
Использование v2.4.3 запросов lib и Python 2.7.9
источник
Вот что говорится в документации по запросу:
Authorization headers set with headers= will be overridden if credentials are specified in .netrc, which in turn will be overridden by the auth= parameter. Authorization headers will be removed if you get redirected off-host.
Вы перенаправлены на ваш запрос?
В этом случае попробуйте отключить перенаправление с помощью этой опции в пост-запросе:
allow_redirects=False
источник
allow_redirects=False
будет только препятствовать тому, чтобы запросы следовали за перенаправлением, запрошенным сервером. Это не поможет завершить запрос, просто остановит его посередине.Первая (и, возможно, реальная) проблема, которую я вижу, заключается в том, как вы создаете,
bearer_token
потому что вы кодируете не только свой токен, но и тип аутентификации.'Bearer'
Как я понял, вам нужно только закодировать токен и указать пустой тип аутентификации + закодированный токен в заголовке вашего запроса:
Если это (также) проблема перенаправления, вы можете просто узнать правильное местоположение и сделать запрос на этот URL, или вы можете подумать об отправке токена доступа в теле вашего,
POST
если сервер принимает это.источник
Из документации:
Requests will attempt to get the authentication credentials for the URL’s hostname from the user’s netrc file. The netrc file overrides raw HTTP authentication headers set with headers=. If credentials for the hostname are found, the request is sent with HTTP Basic Auth.
Если вы перенаправлены, вы можете попробовать использовать
allow_redirects=false
источник
Вы можете попробовать использовать пользовательскую авторизацию в заголовках.
Определите пользовательский класс аутентификации:
затем используйте это, чтобы отправить запрос:
Если это работает, пожалуйста, примите ответ. Или, если у вас все еще есть проблема, сообщите нам. Надеюсь это поможет.
источник
requests.auth.AuthBase
. Если вы посмотрите на исходный код для него, вы увидите, что все, что он делает, это поднять,NotImplemented
если вы забудете переопределить__call__
.