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請求,伺服器收到的資料如下(可以看到鍵名和值之間沒有空格了哦。。):