我有许多功能可以使用python成功POST一个urlencoded主体。但是,我有一个多维字典的正文。使用这个字典,我只得到400(不良请求)。 bodytmp(下面)是使用Fiddler工作的主体的一个例子。 (实际的url和body无法提供。)我还提供了一个递归的urlencode函数,我在这里找到它并且现在正在使用但没有成功。
是否有人对使用urlencoded主体的多维字典的此类POST请求有经验?
谢谢。 (我已经缩写了代码以使其更具可读性,但这是要点。)
来自httplib2导入Http 导入httplib import urllib
def 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
def recursive_urlencode(d): def递归(d,base = 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))
答案 0 :(得分:1)
我建议你将你的身体序列化为JSON并在服务器收到它时反序列化吗?这样你只需要进行url字符串编码,而不是使用自己的递归url编码。