繼上一篇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請求,服務器收到的數據如下(可以看到鍵名和值之間沒有空格了哦。。):