国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

requests 發(fā)送一個 json 格式的 post 請求

這篇具有很好參考價值的文章主要介紹了requests 發(fā)送一個 json 格式的 post 請求。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

今天給一位同學解決post發(fā)送數據格式為json格式的請求,順便確認一下問題歸屬。

背景:

用postman工具發(fā)送一個數據格式為json的請求,得到了服務器的響應。

用python的requests庫寫的請求,卻報錯了。沒有得到該有的結果。

解決方法:
  1. 先確認自己的請求信息和函數使用正確。包括請求頭、請求體和參數傳遞。

  1. 看服務端的日志,如果服務端的日志當中收到了這2個請求的請求數據,看日志中提示什么錯誤并比對一下2份請求數據的不同,順便有需要找開開聊聊。

基于此,來說說requests中發(fā)送json格式的處理。

1、json數據格式的請求頭

在post請求當中,json數據格式的請求,請求頭常規(guī)為:Content-Type:application/json

2、requests庫中 post請求的json參數

  post請求方法:post(url,data=None,json=None,**kwargs)

python的requests的post請求中,有一個json參數。源碼中對于此參數的說明如下:

requests  發(fā)送一個 json 格式的 post 請求

一個json序列化的python對象。python中字典表達與json很相似。

在post請求中,對傳進來的json值,會做如下處理:

  1、會使用json模塊中的dumps方法轉成json數據。

  2、會增加消息頭中的content_type為application/json

所以,json參數不需要提前使用json模塊的方法轉成json字符串。

請注意,這里有坑:如果在傳參時,提前轉換成json字符串:requests.request("post",url,json=json.dumps(a),headers=headers)

在post請求中,還會再使用jsons模塊轉成json數據。那么此時的請求數據會在最外多了一層引號。

請求數據結果為:"{\"pwd\": \"1234567890\", \"mobilephone\": \"18611000001\"}"

而實際上我們要發(fā)送的數據是沒有外層引號的,即:{\"pwd\": \"1234567890\", \"mobilephone\": \"18611000001\"}

源碼如下:

requests  發(fā)送一個 json 格式的 post 請求

3、示例代碼(僅為用法示例。演示接口并不支持application/json格式):

importrequestsa={"mobilephone":"18611000001","pwd":"xxxxxxxxxxxx"}url="http://XXXXXXXX"#消息頭指定headers={'Content-Type':'application/json;charset=UTF-8'}#發(fā)送post請求 json參數直接為一個字典數據。res=requests.request("post",url,json=a,headers=headers)print(res.status_code)print(res.text)

打印發(fā)送出去的請求數據,請求的結果:

sessions.py499行打印發(fā)送請求數據:請求頭為:{'User-Agent':'python-requests/2.19.1','Accept-Encoding':'gzip, deflate','Content-Type':'application/json;charset=UTF-8','Content-Length':'51','Connection':'keep-alive','Accept':'*/*'}請求體為:b'{"pwd": "1234567890", "mobilephone": "18611000001"}'
200{"status":0,"code":"20103","data":null,"msg":"手機號不能為空"}

json 請求中固定鍵名順序 & 消除鍵和值之間的空格

實際工作中遇到了以下2種情況。

  1. 服務端要求json字符串,鍵名的順序固定

  1. 服務端對于接收到的json數據中,若key和value之間有空格,則解析不了。

第1種情況:服務端要求json字符串,鍵名的順序固定

服務端在解析客戶端請求時,要求收到的請求json數據中,鍵名的順序要固定 。比如第一個鍵名必須是mac,第二個鍵名必須是agentCode等。

而我們使用requests發(fā)送請求數據時,我們是對字典進行json處理的,順序并不是固定的。

處理方法:在給requests傳參時,就給固定順序的字典就好。

使用collections.OrderedDict。它是有序字典,記住了鍵值對的添加順序。

請注意:如果初始化的時候同時傳入多個參數,它們的順序是隨機的,不會按照位置順序存儲。

示例代碼:

importcollections
content=collections.OrderedDict()content["mac"]="NDU1N2RkOTRiYjQ3ZDI5YzI0ZmI5YTQ3ZjMxZGU0OTc2YWY2ZTc3Zg=="content["agentcode"]="100001"content["msgbody"]={"customercode":"02000003","sourceinfo":[{"SourceCode":"10001","startdate":"20190601","enddate":"20190601"}]}
print(content)
#輸出結果:按鍵名添加的順序輸出OrderedDict([('mac','NDU1N2RkOTRiYjQ3ZDI5YzI0ZmI5YTQ3ZjMxZGU0OTc2YWY2ZTc3Zg=='),('agentcode','100001'),('msgbody',{'sourceinfo':[{'SourceCode':'10001','startdate':'20190601','enddate':'20190601'}],'customercode':'02000003'})])

通過使用orderedDict處理之后,將content作為requests請求中json參數值。那么發(fā)給服務器端的數據,就是固定的鍵名順序。

處理之后,服務器收到的請求數據:

requests  發(fā)送一個 json 格式的 post 請求

第2種情況:服務端對于接收到的json數據中,若key和value之間有空格,則解析不了。

在解決了固定順序鍵名問題之后,可能你還會遇到,后臺開發(fā)大佬 跟你說:不行啊,你這鍵名和鍵值之間有空格,我們不支持解析。

這種情況下,要么你讓開發(fā)改代碼,要么你自己發(fā)送的請求中去掉空格。如果你說服不了開發(fā)改,那就只能自己處理啦。自己的處理的話,請繼續(xù)往下看。

此乃空格:

requests  發(fā)送一個 json 格式的 post 請求

首先,找原因。空格是怎么來的??

在requests庫的源碼當中,發(fā)送出去的請求數據,默認鍵名和鍵值之間都是帶空格的。

在源碼當中,對傳進來的json參數,使用json庫的dumps函數轉換成json對象,而dumps函數默認設置了鍵名和鍵值之間的留有一個空格。

requests  發(fā)送一個 json 格式的 post 請求
requests  發(fā)送一個 json 格式的 post 請求
requests  發(fā)送一個 json 格式的 post 請求

所以,要消除鍵與值之間的空格,需要在requests的源碼當中,將參數轉換成json對象時,設置separators的值去掉空格。這樣發(fā)往服務器的數據中鍵名和值之間就沒有空格了。

修改源碼如下:

在requests源碼的models.py文件中,找到prepare_body函數,修改如下圖片中,紅色框框中的內容:指定json中鍵名和鍵值之間無空格

requests  發(fā)送一個 json 格式的 post 請求

修改完成之后,再次向服務器發(fā)送json數據格式的post請求,服務器收到的數據如下(可以看到鍵名和值之間沒有空格了哦。。):

requests  發(fā)送一個 json 格式的 post 請求

json 請求中中文亂碼處理

最近收到一個問題:json格式請求數據中有中文,導致服務端簽名失敗。

問題詳情:

一位同學在發(fā)送json格式的post請求時,請求數據中有中文內容:

{"inputCodes":["6932608700850"],"terminal":{"status":1,"channel":"D002","storeCode":"2107","passage":"D002","storeName":"重百超市黃泥塝店","identity":"","maxProductCount":5,"posId":"D002"}}

header={"client_id":"DataSync","sign":"46BA170CFC30C571358E59EDDA63B506","Content-Type":"application/json;charset=UTF-8"}

在使用requests庫的post請求發(fā)送出去之后,服務端收到的不是中文,導致簽名失敗,數據如下:

{"terminal": {"status": 1, "channel": "D002", "identity": "", "passage": "D002", "maxProductCount": 5, "posId": "D002", "storeName": "\u91cd\u767e\u8d85\u5e02\u9ec4\u6ce5\u585d\u5e97", "storeCode": "2107"}, "inputCodes": ["6932608700850"]}

requests  發(fā)送一個 json 格式的 post 請求

希望在服務端中收到的數據中,中文仍然是中文,因為有些服務端并沒有此做處理。

解決方法:

requests庫中,在處理json格式的請求時調用的json.dumps方法參數ensure_ascii默認為True.表示序列化時對中文默認使用的ascii編碼。

如果想要顯示中文,則將此參數的值改為False即可。

源碼修改:

在requests源碼的models.py文件中,找到prepare_body函數。找到如下圖中的代碼,在comlexjson.dumps(json)里加個參數ensure_ascii=False.

requests  發(fā)送一個 json 格式的 post 請求

保存源碼的修改之后,再次運行,在服務器端就能看到中文啦。

如果對你有幫助的話,點個贊收個藏,給作者一個鼓勵。也方便你下次能夠快速查找。

如有不懂還要咨詢下方小卡片,博主也希望和志同道合的測試人員一起學習進步

在適當的年齡,選擇適當的崗位,盡量去發(fā)揮好自己的優(yōu)勢。

我的自動化測試開發(fā)之路,一路走來都離不每個階段的計劃,因為自己喜歡規(guī)劃和總結,

測試開發(fā)視頻教程、學習筆記領取傳送門!?。?/span>文章來源地址http://www.zghlxwxcb.cn/news/detail-467537.html

requests  發(fā)送一個 json 格式的 post 請求

到了這里,關于requests 發(fā)送一個 json 格式的 post 請求的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Python+Requests模擬發(fā)送post請求

    Python+Requests模擬發(fā)送post請求

    發(fā)送post請求的基礎知識dumps和loads 代碼示例: 以微信開放平臺舉例 發(fā)送post請求 查看執(zhí)行結果: ?上傳文件 查看執(zhí)行結果 ?封裝post請求 代碼示例: 封裝main方法 代碼示例: 封裝測試類 示例代碼: 光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用

    2024年02月07日
    瀏覽(22)
  • Python爬蟲requests判斷請求超時并重新post/get發(fā)送請求

    在上面的示例中,send_request_get函數接受一個URL作為參數,并可選地指定最大重試次數和超時時間。函數使用 requests.get 發(fā)送GET請求,并設置了超時時間為5秒。如果請求超時,會捕獲 requests.exceptions.Timeout 異常,并輸出重試信息。如果發(fā)生其他異常,會捕獲 requests.exceptions.Req

    2024年02月11日
    瀏覽(34)
  • 【Vue3】發(fā)送post請求出現400 Bad Request 報錯

    查了一下網上資料,報400一般無非就是兩種: 1. Bad Request:“錯誤的請求\\\" 2. Invalid Hostname:\\\"不存在的域名” 在這里我的報錯是因為前端請求頭的content-type和后端不一致。 一般后端默認的內容類型是 application/x-www-form-urlencoded,而axios默認的是?applecation/json。 但是也有例外,要

    2024年02月09日
    瀏覽(33)
  • requests之post請求data傳參和json傳參區(qū)別

    requests之post請求data傳參和json傳參區(qū)別

    在一次接口post測試請求傳參異常的記錄 傳輸到后臺服務器報了異常 顯而易見我的請求頭的content-type類型有異常了,但我明明傳的是application/json為什么給我轉成了另外的格式呢? 在解釋之前先提一下 httpbin.org 這個網站,這個網站的介紹是 A simple HTTP Request Response Service. ,簡

    2024年02月10日
    瀏覽(25)
  • 在postman中使用raw純文本格式發(fā)送POST請求成功而在python爬蟲中發(fā)送POST請求失敗

    在postman中使用raw純文本格式發(fā)送POST請求成功而在python爬蟲中發(fā)送POST請求失敗

    在postman中是成功的 我查了很多資料,說raw是純文本格式提交的,我又去看postman中的headers,查看content-Type中指定了格式 修改了爬蟲中的headers 或者把data寫出字典格式,再用json.dumps(data)轉換一下

    2024年02月12日
    瀏覽(17)
  • Python使用POST方法發(fā)送HTTP請求的15個示例(基于requests)

    以下是使用 requests 庫調用HTTP接口進行POST請求的15個示例: 發(fā)送簡單的POST請求: 發(fā)送JSON格式的POST請求: 發(fā)送XML格式的POST請求: 發(fā)送文件的POST請求:

    2024年02月10日
    瀏覽(23)
  • 【JavaScript】 發(fā)送 POST 請求并帶有 JSON 請求體的幾種方法

    ?在現代的前端開發(fā)中,與后端進行數據交互是必不可少的。其中,發(fā)送 POST 請求并帶有 JSON 請求體是一種常見的需求。在本文中,我們將介紹在 JavaScript 中實現這一需求的幾種方法。 ? XMLHttpRequest 是一種傳統的發(fā)送網絡請求的方式。以下是一個使用 XMLHttpRequest 發(fā)送 POST 請

    2024年03月19日
    瀏覽(27)
  • java http get post 和 發(fā)送json數據請求

    java http get post 和 發(fā)送json數據請求

    瀏覽器請求效果 ? ? ? main調用 ?

    2024年02月16日
    瀏覽(32)
  • Postman發(fā)送post請求時報400錯誤,Required request body is missing

    Postman發(fā)送post請求時報400錯誤,Required request body is missing

    項目形參位置存在@RequestBody注解,用Postman發(fā)送post請求時報400錯誤,Required request body is missing。 錯誤圖示: 解決方法: 方法一: 項目中形參位置不使用@RequestBody,在Postman進行Post請求時,在請求路徑后直接拼接參數。 方法二: 項目中形參位置使用@RequestBody,在Postman進行Po

    2024年02月11日
    瀏覽(26)
  • Postman發(fā)送post和get請求json數據,并用SpringBoot接受

    Postman發(fā)送post和get請求json數據,并用SpringBoot接受

    1. 在controller類中加入如下代碼用于舉例 TestContoller.java 這里有兩個映射,一個是\\\"/test\\\",用于測試程序有沒有成功,一個是\\\"/User\\\",為用戶,存放用戶的賬戶名和密碼 2. 在dto中導入數據以封裝數據 TestDto.java @Data在導入lombok插件和依賴后可以直接使用,可以起到簡化代碼的作用 在

    2023年04月09日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包