python?requests.post請(qǐng)求404問題及解決方法
問題場(chǎng)景
有時(shí)候,在編寫一段http接口請(qǐng)求程序時(shí),發(fā)現(xiàn)代碼中的header頭和請(qǐng)求體中都是原網(wǎng)頁中一樣,但是,在實(shí)際請(qǐng)求時(shí),接口卻返回404,代碼如下
header = {
# ':authority': 'm.ctrip.com',
# ':method': 'POST',
# ':path': '/restapi/soa2/20405/getPCSightList',
# ':scheme': 'https',
'accept': '*/*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': 'xx',
'cache-control': "no-cache",
'content-length': '373',
'content-type': 'application/json;charset:utf-8;',
'cookies': 'xx',
'origin': 'https://www.tripadvisor.cn',
'pragma': 'no-cache',
'referer': 'https://www.tripadvisor.cn/Attractions-g60763-New_York_City_New_York-Vacations.html',
'sec-ch-ua': "'.Not/A)Brand';v='99', 'Google Chrome';v='103', 'Chromium';v='103'",
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': 'macOS',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
'x-ta-uid': 'cd58b674-7dba-484a-a908-3239120cd728'
}
url = 'https://m.ctrip.com/restapi/soa2/20405/getPCSightList'
data = {"geoId":60763,"pageIndex":1,"pageSize":30,"travelRanking":"false","needSelectedFilters":"true","filters":[{"type":"subcategory","param":""},{"type":"subtype","param":""},{"type":"neighborhood","param":""},{"type":"travelerRating","param":""},{"type":"awards","param":""},{"type":"waypointairport","param":""},{"type":"waypointstation","param":""},{"type":"other","param":""}]}
response = requests.post(url=url, data=data, headers=header)
print(response.status_code)
運(yùn)行結(jié)果為

問題分析
既然404,那就排查問題,data和header都是直接從復(fù)制瀏覽器中復(fù)制過來的,不會(huì)有問題,那有問題的必然是request.post中的方法問題
查看request.post源碼

從源碼中可以看到,request.post可以接受兩個(gè)參數(shù),一個(gè)是data,還有一個(gè)是json,
data是以字典的形式發(fā)送body,json則是以json數(shù)據(jù)格式發(fā)送body
通過這兩個(gè)注釋可以很明顯的發(fā)現(xiàn),requests.post在發(fā)送請(qǐng)求時(shí),會(huì)根據(jù)當(dāng)前傳遞的參數(shù)來選擇不同的方式,可以理解為一種是表單形式,還有一種是json格式
postman測(cè)試
通過postman來測(cè)試兩種不同請(qǐng)求下的情況
form表單

Json數(shù)據(jù)

通過postman測(cè)試可以發(fā)現(xiàn),當(dāng)前服務(wù)后端接口僅接受json格式的數(shù)據(jù),即content-type為application.json
問題解決
將原先代碼中data替換成json
response = requests.post(url=url, json=data, headers=JsonHeader)

這個(gè)時(shí)候肯定有人會(huì)問,那我使用data傳遞數(shù)據(jù)時(shí),將header頭中的content-type指定為application/json不就行了,但其實(shí)是不行的,就算自己指定了,最后request.body的值也是類似于key1=value1&key2=value2這種形式
結(jié)論
當(dāng)request.post使用json來傳遞參數(shù)時(shí),即使不指定content-type類型,也會(huì)默認(rèn)指定application/json

使用data傳遞參數(shù)時(shí),將會(huì)以表單的形式進(jìn)行提交,并且后續(xù)將通過urlencode轉(zhuǎn)換成字符串,及key1=value1&key2=value2的形式

使用data時(shí),即使指定了content-type也不會(huì)生效,后續(xù)將會(huì)被默認(rèn)替換掉

因此,需要根據(jù)自己實(shí)際情況來分析當(dāng)前接口接收數(shù)據(jù)時(shí)使用的是什么格式,但目前一般的網(wǎng)站都開始采用application/jsond的數(shù)據(jù)格式
到此這篇關(guān)于python requests.post請(qǐng)求404問題的文章就介紹到這了,更多相關(guān)python requests.post請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Python requests庫發(fā)送JSON數(shù)據(jù)的POST請(qǐng)求步驟
- python如何使用requests提交post請(qǐng)求并上傳文件(multipart/form-data)
- python中Requests發(fā)送json格式的post請(qǐng)求方法
- Python接口自動(dòng)化之淺析requests模塊post請(qǐng)求
- 詳解python requests中的post請(qǐng)求的參數(shù)問題
- python爬蟲使用requests發(fā)送post請(qǐng)求示例詳解
- python利用requests庫模擬post請(qǐng)求時(shí)json的使用教程
- Python中Requests POST請(qǐng)求解讀
相關(guān)文章
Python Selenium XPath根據(jù)文本內(nèi)容查找元素的方法
這篇文章主要介紹了Python Selenium XPath根據(jù)文本內(nèi)容查找元素的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
在django中,關(guān)于session的通用設(shè)置方法
今天小編就為大家分享一篇在django中,關(guān)于session的通用設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色
這篇文章主要為大家詳細(xì)介紹了如何使用Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2025-02-02
在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細(xì)教程
使用os.system()這個(gè)方法簡(jiǎn)單直接,但它不返回命令的輸出,只返回命令的退出狀態(tài),如果你只需要知道命令是否成功執(zhí)行,這個(gè)方法就足夠了,這篇文章主要介紹了在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細(xì)教程,需要的朋友可以參考下2024-02-02
python3獲取兩個(gè)日期之間所有日期,以及比較大小的實(shí)例
下面小編就為大家分享一篇python3獲取兩個(gè)日期之間所有日期,以及比較大小的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python實(shí)現(xiàn)獲取本地及遠(yuǎn)程圖片大小的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)獲取本地及遠(yuǎn)程圖片大小的方法,結(jié)合實(shí)例形式分析了Python使用PIL、urllib2及cStringIO模塊獲取本機(jī)或遠(yuǎn)程圖片大小信息的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Python讀取postgresql數(shù)據(jù)庫詳情
這篇文章主要介紹了Python讀取postgresql數(shù)據(jù)庫詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09

