2016-10-05 3 views
2

Я пытаюсь использовать модуль запроса python для передачи нескольких значений серверу с использованием следующего кода, но в HTTP-запросе он меняет порядок значений полезной нагрузки.полезная нагрузка python без сортировки

payload3 = {'OSILA_LinkTo_Site': OSILA_LinkTo_Site, 'OSILA_LinkTo_Service': OSILA_LinkTo_Service, 'OSILA_Locale': OSILA_Locale, 'OSILA_Locale_display': OSILA_Locale, 'OSILA_TimeZone': OSILA_TimeZone, 'OSILA_TimeZone_display': OSILA_TimeZone, 'selectedUser': '', 'OSILA_LinkTo_User_display': '', 'OSILA_LinkTo_User': OSILA_LinkTo_User, 'OSILA_DisplayName': OSILA_DisplayName, 'OSILA_CountryCode': OSILA_CountryCode, 'OSILA_AreaCode': OSILA_AreaCode, 'OSILA_LocalOfficeCode': OSILA_LocalOfficeCode, 'OSILA_LinkTo_Extension': OSILA_LinkTo_Extension, 'OSILA_ProductPackage': OSILA_ProductPackage, 'OSILA_ProductPackage_display': OSILA_ProductPackage, 'OSILA_DeviceType': OSILA_DeviceType, 'OSILA_DeviceType_display': OSILA_DeviceType, 'OSILA_Parameter_4': OSILA_Parameter_4, 'OSILA_Parameter_4_display': OSILA_Parameter_4, 'OSILA_Parameter_3': OSILA_Parameter_3, 'OSILA_Parameter_3_display': OSILA_Parameter_3, 'OSILA_Parameter_2': OSILA_Parameter_2, 'OSILA_Parameter_2_display': OSILA_Parameter_2, 'OSILA_Parameter_5': OSILA_Parameter_5, 'OSILA_Parameter_5_display': OSILA_Parameter_5, 'OSILA_Parameter_1': OSILA_Parameter_1, 'OSILA_Parameter_1_display': OSILA_Parameter_1, 'OSILA_CreateNewFax': OSILA_CreateNewFax, 'OSILA_LinkTo_ServiceFax': '', 'OSILA_CountryCodeFax': '', 'OSILA_AreaCodeFax': '', 'OSILA_LocalOfficeCodeFax': '', 'OSILA_LinkTo_ExtensionFax': '', 'OSILA_ProvisioningDate': OSILA_ProvisioningDate, 'OSILA_DateMail_1': OSILA_ProvisioningDate, 'OSILA_DateMail_2': '', 'OSILA_DateMail_3': '', 'OSILA_DateMail_4': '', 'OSILA_DateMail_5': '', 'OSILA_DateMail_6': '', 'OSILA_DateMail_7': '', 'OSILA_DateMail_8': '', 'OSILA_DateMail_9': '', 'attachEventListeners': '', 'webMgrRequestId': webMgrRequestId, 'WT': WT2, 'enterConfirm': 'true', 'users_R_0_C__select': 'on', 'selectedUser': '0'} 

subcr = session.post("http://192.168.0.10:8080/OSILAManager/createSubscriber2.do", data=payload3)

с помощью браузера я могу видеть, что значения проходят в следующем порядке, но когда я использую питон его изменения порядка, есть ли способ избежать этого сортировки

OSILA_LinkTo_Site 
OSILA_LinkTo_Service 
OSILA_Locale 
OSILA_Locale_display 
OSILA_TimeZone 
OSILA_TimeZone_display 
users_R_0_C__select 
selectedUser 
OSILA_LinkTo_User_display 
OSILA_LinkTo_User 
OSILA_DisplayName 
OSILA_CountryCode 
OSILA_AreaCode 
OSILA_LocalOfficeCode 
OSILA_LinkTo_Extension 
OSILA_ProductPackage 
OSILA_ProductPackage_display 
OSILA_DeviceType 
OSILA_DeviceType_display 
OSILA_Parameter_4 
OSILA_Parameter_4_display 
OSILA_Parameter_3 
OSILA_Parameter_3_display 
OSILA_Parameter_2 
OSILA_Parameter_2_display 
OSILA_Parameter_5 
OSILA_Parameter_5_display 
OSILA_Parameter_1 
OSILA_Parameter_1_display 
OSILA_CreateNewFax 
OSILA_LinkTo_ServiceFax 
OSILA_CountryCodeFax 
OSILA_AreaCodeFax 
OSILA_LocalOfficeCodeFax 
OSILA_LinkTo_ExtensionFax 
OSILA_ProvisioningDate 
OSILA_DateMail_1 
OSILA_DateMail_2 
OSILA_DateMail_3 
OSILA_DateMail_4 
OSILA_DateMail_5 
OSILA_DateMail_6 
OSILA_DateMail_7 
OSILA_DateMail_8 
OSILA_DateMail_9 
attachEventListeners 
webMgrRequestId 
WT 
enterConfirm 
+0

Словари не имеют заказа. use 'collections.OrderedDict' –

+1

Или python 3.6 - они упорядочены в python 3.6 – Mathias

+0

У вас есть дубликаты ключей, так что это, вероятно, большая проблема –

ответ

1

Вы можете передать кортежи вместо Dict:

In [7]: 
    ...: import requests 
    ...: d = {"foo":"bar","bar":"foo","123":"456"} 
    ...: t = (("foo","bar"),("bar","foo"),("123","456")) 
    ...: r1 = requests.post("http://httpbin.org", data=d) 
    ...: r2 = requests.post("http://httpbin.org", data=t) 
    ...: print(r1.request.body) 
    ...: print(r2.request.body) 
    ...: 
bar=foo&123=456&foo=bar 
foo=bar&bar=foo&123=456 

Также у ou имеют selectedUser два раза в вашем dict, так что вы не будете работать, поскольку у вас будет только последняя пара ключей/значений, которую вы назначаете, не знаете, какой правильный формат, но снова кортежи позволят вам повторить ключ:

In [8]: import requests 
    ...: d = {"foo":"bar","bar":"foo","123":"456","selectedUser":"0", "selectedUs 
    ...: er":"1"} 
    ...: t = (("foo","bar"),("bar","foo"),("123","456"), ("selectedUser","0"),("s 
    ...: electedUser","1")) 
    ...: r1 = requests.post("http://httpbin.org", data=d) 
    ...: r2 = requests.post("http://httpbin.org", data=t) 
    ...: print(r1.request.body) 
    ...: print(r2.request.body) 
    ...: 
bar=foo&selectedUser=1&123=456&foo=bar 
foo=bar&bar=foo&123=456&selectedUser=0&selectedUser=1 

Вы можете видеть, используя dict, вы оставляете только selectedUser=1, так как это последняя из назначенных пар. На самом деле это может быть вашей проблемой больше, чем порядок клавиш сообщения. Если вы только хотели использовать selectedUser, то удалите все, что вы не хотели публиковать.

Смежные вопросы