Saya mencoba membuat permintaan POST API menggunakan pustaka permintaan Python. Saya melewati Authorization
header tetapi ketika saya mencoba debugging, saya bisa melihat bahwa header sedang dijatuhkan. Saya tidak tahu apa yang sedang terjadi.
Ini kode saya:
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)
Seperti yang Anda lihat di atas, saya secara manual mengatur Authorization
header argumen permintaan, tapi itu hilang header permintaan yang sebenarnya itu:
{'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+'}
.
Sepotong informasi tambahan adalah bahwa jika saya mengubah permintaan POST menjadi permintaan GET, Authorization
header akan melewati secara normal!
Mengapa pustaka ini menjatuhkan header untuk permintaan POST dan bagaimana cara membuatnya agar berfungsi?
Menggunakan v2.4.3 dari permintaan lib dan Python 2.7.9
sumber
Inilah yang dikatakan dokumentasi permintaan:
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.
Apakah Anda dialihkan ke permintaan Anda?
Jika demikian, coba nonaktifkan pengalihan dengan opsi ini dalam permintaan posting:
allow_redirects=False
sumber
allow_redirects=False
hanya akan mencegah permintaan mengikuti pengalihan yang diminta oleh server. Ini tidak akan membantu menyelesaikan permintaan, itu hanya akan menghentikannya di tengah.Masalah pertama (dan mungkin yang sebenarnya) yang saya lihat adalah bagaimana Anda membuat
bearer_token
karena Anda tidak hanya mengkodekan token Anda, tetapi juga jenis otentikasi'Bearer'
Seperti yang saya pahami, Anda hanya perlu menyandikan token dan harus memberikan jenis autentikasi kosong + token yang disandikan dalam tajuk permintaan Anda:
Jika ini (juga) merupakan masalah pengalihan, Anda bisa mengetahui lokasi yang benar dan mengajukan permintaan Anda ke url ini atau Anda mungkin berpikir untuk mengirim token akses ke dalam tubuh Anda
POST
jika server menerima ini.sumber
Dari dokumentasi:
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.
Jika Anda diarahkan, Anda dapat mencoba menggunakan
allow_redirects=false
sumber
Anda dapat mencoba menggunakan otorisasi khusus dalam tajuk.
Tentukan kelas otentikasi khusus:
kemudian gunakan ini untuk mengirim permintaan:
Jika ini berhasil tolong terima jawabannya. Atau jika Anda masih memiliki masalah, beri tahu kami. Semoga ini membantu.
sumber
requests.auth.AuthBase
. Jika Anda melihat kode sumber untuk itu, Anda akan melihat bahwa yang dilakukannya hanyalah menaikkanNotImplemented
jika Anda lupa menimpanya__call__
.