Estou tentando fazer uma solicitação de API POST usando a biblioteca de solicitações Python. Estou passando por um Authorization
cabeçalho, mas quando tento depurar, vejo que o cabeçalho está sendo descartado. Eu não tenho ideia do que está acontecendo.
Aqui está o meu código:
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)
Como você pode ver acima, eu definir manualmente o Authorization
cabeçalho nos argumentos pedido, mas está faltando os cabeçalhos do pedido real:
{'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+'}
.
Uma informação adicional é que, se eu alterar a solicitação POST para uma solicitação GET, o Authorization
cabeçalho passa normalmente!
Por que essa biblioteca descartaria o cabeçalho das solicitações POST e como faço para que isso funcione?
Usando a v2.4.3 das solicitações lib e Python 2.7.9
fonte
É isso que a documentação da solicitação diz:
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.
Você está sendo redirecionado em sua solicitação?
Se esse for o caso, tente desativar o redirecionamento com esta opção na solicitação de postagem:
allow_redirects=False
fonte
allow_redirects=False
apenas impedirá que as solicitações sigam o redirecionamento solicitado pelo servidor. Isso não ajudará a concluir a solicitação, apenas a interromperá no meio.O primeiro (e talvez o real) problema que vejo é como você cria
bearer_token
porque não está codificando apenas seu token, mas também o tipo de autenticação'Bearer'
Pelo que entendi, você só precisa codificar o token e precisa fornecer o tipo de autenticação em branco + o token codificado no cabeçalho da sua solicitação:
Se for (também) um problema de redirecionamento, você pode simplesmente descobrir o local correto e fazer sua solicitação para esse URL ou pensar em enviar o token de acesso dentro do corpo do seu,
POST
se o servidor estiver aceitando isso.fonte
A partir da documentação:
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.
Se você estiver sendo redirecionado, tente usar
allow_redirects=false
fonte
você pode tentar usar uma autorização personalizada nos cabeçalhos.
Defina uma classe de autenticação personalizada:
use isso para enviar a solicitação:
Se isso funcionar, aceite a resposta. Ou se você ainda tiver problemas, informe-nos. Espero que isto ajude.
fonte
requests.auth.AuthBase
. Se você olhar para o código-fonte, verá que tudo o que faz é aumentarNotImplemented
se você esquecer de substituir__call__
.