У меня есть много функций, которые успешно отправляют urlencoded тело с использованием python. Однако у меня есть тело, которое является многомерным словарем. Используя этот словарь, я получаю только 400 (плохой запрос). bodytmp (ниже) является примером тела, которое работает с использованием Fiddler. (Фактический url и body не могут быть предоставлены.) Я также включил рекурсивную функцию urlencode, которую я нашел здесь, и использую сейчас, но без успеха.Python POST с urlencoded многомерным словарем
У кого-нибудь есть опыт работы с этим типом запроса POST с многомерным словарем для urlencoded body?
спасибо. (Я сокращенный код, чтобы сделать его более удобным для чтения, но это суть.)
из httplib2 импорта Http импорта HTTPLIB импорт URLLIB
четкости postAgentRegister():
h = Http(disable_ssl_certificate_validation=True)
headers={'Content-Type':'application/x-www-form-urlencoded'}
bodytmp={"Username": "username",
"Password": "password",
"AccountId": "accountid",
"PublicKey": {
"Value1a": "32ab45cd",
"value1b": "10001"
},
"snId": "SN1",
"IpAddresses": {
"Value2a": ["50.156.54.45"],
"Value2b": "null"
}
}
body=recursive_urlencode(bodytmp)
try:
response,content=h.request('https://server/endpoint','POST',headers=headers,body=body)
conn = httplib.HTTPConnection(testserver)
conn.request('POST', endpoint, body, headers)
r1 = conn.getresponse()
status = r1.status
reason = r1.reason
except httplib.HTTPException, e:
status= e.code
print 'status is: ', status
четкости recursive_urlencode (г): защиту рекурсии (д, база = None): пар = []
for key, value in d.items():
if hasattr(value, 'values'):
pairs += recursion(value, key)
else:
new_pair = None
if base:
new_pair = "%s[%s]=%s" % (base, urllib.quote(unicode(key)), urllib.quote(unicode(value)))
else:
new_pair = "%s=%s" % (urllib.quote(unicode(key)), urllib.quote(unicode(value)))
pairs.append(new_pair)
return pairs
return '&'.join(recursion(d))
Вы протестировали это со словарем, который имеет предполагаемую структуру, но с минимальным содержанием, чтобы гарантировать, что проблема не зависит от длины/содержимого тестовых данных? – octern
Я использую этот код для тестирования существующей конечной точки API. IOW, нет другой конечной точки, которая имеет похожую структуру, но минимальный контент, как вы предлагаете. Однако все остальные конечные точки (без вложенных уровней в json) работают так, как ожидалось. И тело выше работает при подаче через Fiddler. – ftg