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


繼上一篇requests發送json請求的文章后,實際工作中遇到了以下2種情況。

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

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

 

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

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

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

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

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

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

示例代碼:

 1 import collections
 2 
 3 content  = collections.OrderedDict()
 4 content ["mac"] = "NDU1N2RkOTRiYjQ3ZDI5YzI0ZmI5YTQ3ZjMxZGU0OTc2YWY2ZTc3Zg=="
 5 content ["agentcode"] = "100001"
 6 content ["msgbody"] = {"customercode":"02000003","sourceinfo":[{"SourceCode":"10001","startdate":"20190601","enddate":"20190601"}]}
 7 
 8 print(content)
 9 
10 #輸出結果:按鍵名添加的順序輸出
11 OrderedDict([('mac', 'NDU1N2RkOTRiYjQ3ZDI5YzI0ZmI5YTQ3ZjMxZGU0OTc2YWY2ZTc3Zg=='), ('agentcode', '100001'), ('msgbody', {'sourceinfo': [{'SourceCode': '10001', 'startdate': '20190601', 'enddate': '20190601'}], 'customercode': '02000003'})])

 

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

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

 

 

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

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

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

此乃空格:

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

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

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

 

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

修改源碼如下:

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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM