Próbuję złożyć żądanie POST API przy użyciu biblioteki żądań Python. Przechodzę przez Authorization
nagłówek, ale kiedy próbuję debugować, widzę, że nagłówek jest upuszczany. Nie mam pojęcia, co się dzieje.
Oto mój kod:
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)
Jak widać powyżej, ręcznie ustawić Authorization
nagłówek w argumentach żądanie, ale brakuje nagłówków aktualnie prośbą za:
{'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+'}
.
Dodatkową informacją jest to, że jeśli zmienię żądanie POST na żądanie GET, Authorization
nagłówek przechodzi normalnie!
Dlaczego ta biblioteka upuszcza nagłówek żądań POST i jak mogę to uruchomić?
Korzystanie z wersji 2.2.3 żądań lib i Python 2.7.9
źródło
Tak mówi dokumentacja wniosku:
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.
Czy otrzymujesz przekierowanie w swoim żądaniu?
W takim przypadku spróbuj wyłączyć przekierowanie za pomocą tej opcji w żądaniu postu:
allow_redirects=False
źródło
allow_redirects=False
po prostu zapobiegnie przesyłaniu żądań przez przekierowanie żądane przez serwer. To nie pomoże w wypełnieniu wniosku, po prostu zatrzyma go w środku.Pierwszym (i być może faktycznym) problemem, jaki widzę, jest sposób tworzenia,
bearer_token
ponieważ nie kodujesz tylko tokena, ale także typ uwierzytelnienia'Bearer'
Jak zrozumiałem, musisz tylko zakodować token i podać pusty typ uwierzytelnienia + zakodowany token w nagłówku żądania:
Jeśli jest to (także) problem z przekierowaniem, możesz po prostu znaleźć prawidłową lokalizację i złożyć wniosek na ten adres URL lub możesz pomyśleć o wysłaniu tokena dostępu w ciele,
POST
jeśli serwer to akceptuje.źródło
Z dokumentacji:
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.
Jeśli zostaniesz przekierowany, możesz spróbować użyć
allow_redirects=false
źródło
możesz spróbować użyć niestandardowej autoryzacji w nagłówkach.
Zdefiniuj niestandardową klasę uwierzytelniania:
następnie użyj tego, aby wysłać zapytanie:
Jeśli to zadziała, zaakceptuj odpowiedź. Lub jeśli nadal masz problem, daj nam znać. Mam nadzieję że to pomoże.
źródło
requests.auth.AuthBase
. Jeśli spojrzysz na jego kod źródłowy, zobaczysz, że wszystko, co robi, to podnoszenie,NotImplemented
jeśli zapomnisz przesłonić__call__
.