Estoy tratando de hacer una solicitud API POST usando la biblioteca de solicitudes Python. Estoy pasando por un Authorization
encabezado pero cuando intento depurar, puedo ver que el encabezado se está cayendo. No tengo idea de lo que está pasando.
Aquí está mi 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 se puede ver arriba, me puse manualmente el Authorization
encabezado en los argumentos de la petición, pero no se encuentra cabeceras de la solicitud 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+'}
.
Una información adicional es que si cambio la solicitud POST a una solicitud GET, ¡el Authorization
encabezado pasa normalmente!
¿Por qué esta biblioteca dejaría caer el encabezado para las solicitudes POST y cómo puedo hacer que esto funcione?
Usando v2.4.3 de las solicitudes lib y Python 2.7.9
fuente
Esto es lo que dice la documentación de la solicitud:
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.
¿Estás siendo redirigido en tu solicitud?
Si este es el caso, intente desactivar la redirección con esta opción en la solicitud posterior:
allow_redirects=False
fuente
allow_redirects=False
solo evitará que las solicitudes sigan la redirección solicitada por el servidor. Esto no ayudará a completar la solicitud, solo la detendrá en el medio.El primer problema (y tal vez el real) que veo es cómo crea
bearer_token
porque no está codificando solo su token sino también el tipo de autenticación'Bearer'
Como entendí, solo necesita codificar el token y debe proporcionar el tipo de autenticación en blanco + el token codificado dentro del encabezado de su solicitud:
Si es (también) un problema de redireccionamiento, simplemente puede encontrar la ubicación correcta y hacer su solicitud a esta url o puede pensar en enviar el token de acceso dentro del cuerpo de su
POST
si el servidor lo acepta.fuente
De la documentación:
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.
Si está siendo redirigido, puede intentar usar
allow_redirects=false
fuente
puede intentar usar una autorización personalizada en los encabezados.
Defina una clase de autenticación personalizada:
luego use esto para enviar la solicitud:
Si esto funciona, por favor acepte la respuesta. O si aún tiene problemas, infórmenos. Espero que esto ayude.
fuente
requests.auth.AuthBase
. Si observa el código fuente, verá que todo lo que hace es aumentarNotImplemented
si olvida anular__call__
.