Ich versuche, eine API-POST-Anforderung mithilfe der Python-Anforderungsbibliothek zu erstellen. Ich gehe durch einen Authorization
Header, aber wenn ich das Debuggen versuche, kann ich sehen, dass der Header gelöscht wird. Ich habe keine Ahnung, was los ist.
Hier ist mein 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)
Wie Sie oben sehen können, habe ich den Authorization
Header in den Anforderungsargumenten manuell festgelegt , aber es fehlen die Header der tatsächlichen Anforderung :
{'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+'}
.
Eine zusätzliche Information ist, dass, wenn ich die POST-Anfrage in eine GET-Anfrage ändere, der Authorization
Header normal durchläuft!
Warum würde diese Bibliothek den Header für POST-Anfragen löschen und wie kann ich das zum Laufen bringen?
Verwenden von v2.4.3 der Anforderungen lib und Python 2.7.9
quelle
Dies ist, was Anforderungsdokumentation sagt:
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.
Werden Sie in Ihrer Anfrage umgeleitet?
Wenn dies der Fall ist, deaktivieren Sie die Umleitung mit dieser Option in der Post-Anfrage:
allow_redirects=False
quelle
allow_redirects=False
verhindert lediglich, dass Anforderungen der vom Server angeforderten Umleitung folgen. Dies hilft nicht, die Anfrage abzuschließen, sondern stoppt sie nur in der Mitte.Das erste (und vielleicht das eigentliche) Problem, das ich sehe, ist das Erstellen,
bearer_token
da Sie nicht nur Ihr Token, sondern auch den Authentifizierungstyp codieren'Bearer'
Wie ich verstanden habe, müssen Sie nur das Token codieren und den leeren Authentifizierungstyp + das codierte Token in Ihrem Anforderungsheader angeben:
Wenn es sich (auch) um ein Umleitungsproblem handelt, können Sie einfach den richtigen Speicherort herausfinden und Ihre Anfrage an diese URL richten, oder Sie könnten darüber nachdenken, das Zugriffstoken innerhalb Ihres Körpers zu senden,
POST
wenn der Server dies akzeptiert.quelle
Aus der Dokumentation:
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.
Wenn Sie umgeleitet werden, können Sie versuchen, zu verwenden
allow_redirects=false
quelle
Sie können versuchen, eine benutzerdefinierte Berechtigung in Headern zu verwenden.
Definieren Sie eine benutzerdefinierte Authentifizierungsklasse:
Verwenden Sie dies dann, um die Anfrage zu senden:
Wenn dies funktioniert, akzeptieren Sie bitte die Antwort. Oder wenn Sie immer noch Probleme haben, lassen Sie es uns wissen. Hoffe das hilft.
quelle
requests.auth.AuthBase
. Wenn Sie sich den Quellcode ansehen, werden Sie feststellen, dass er nur ausgelöst wird,NotImplemented
wenn Sie vergessen, ihn zu überschreiben__call__
.