J'essaye de faire une requête API POST en utilisant la bibliothèque de requêtes Python. Je passe par un en- Authorization
tête, mais lorsque j'essaie de déboguer, je peux voir que l'en-tête est supprimé. Je ne ai aucune idée de ce qui se passe.
Voici mon code:
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)
Comme vous pouvez le voir ci - dessus, régler manuellement l' en- Authorization
tête dans les arguments de requête, mais il manque les en- têtes de la demande réelle:
{'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+'}
.
Une information supplémentaire est que si je change la demande POST en demande GET, l'en- Authorization
tête passe normalement!
Pourquoi cette bibliothèque supprimerait-elle l'en-tête des requêtes POST et comment puis-je faire en sorte que cela fonctionne?
Utilisation de la version 2.4.3 de la bibliothèque de demandes et de Python 2.7.9
la source
Voici ce que dit la documentation de la demande:
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.
Êtes-vous redirigé dans votre demande?
Si tel est le cas, essayez de désactiver la redirection avec cette option dans la demande de publication:
allow_redirects=False
la source
allow_redirects=False
empêchera simplement les demandes de suivre la redirection demandée par le serveur. Cela n'aidera pas à terminer la demande, cela l'arrêtera simplement au milieu.Le premier (et peut-être le vrai) problème que je vois est de savoir comment créer
bearer_token
car vous n'encodez pas seulement votre jeton mais aussi le type d'authentification'Bearer'
Si j'ai bien compris, il vous suffit de coder le jeton et de fournir le type d'authentification vierge + le jeton codé dans l'en-tête de votre demande:
S'il s'agit (également) d'un problème de redirection, vous pouvez simplement trouver l'emplacement correct et faire votre demande à cette URL ou vous pourriez penser à envoyer le jeton d'accès dans le corps de votre
POST
si le serveur l'accepte.la source
De la documentation:
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 vous êtes redirigé, vous pouvez essayer d'utiliser
allow_redirects=false
la source
vous pouvez essayer d'utiliser une autorisation personnalisée dans les en-têtes.
Définissez une classe d'authentification personnalisée:
puis utilisez ceci pour envoyer la demande:
Si cela fonctionne, veuillez accepter la réponse. Ou si vous avez toujours un problème, faites-le nous savoir. J'espère que cela t'aides.
la source
requests.auth.AuthBase
. Si vous regardez le code source pour cela, vous verrez que tout ce qu'il fait, c'est augmenterNotImplemented
si vous oubliez de remplacer__call__
.