Python POST与urlencoded多维字典

时间:2012-06-07 19:47:43

标签: python post urlencode

我有许多功能可以使用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))

1 个答案:

答案 0 :(得分:1)

我建议你将你的身体序列化为JSON并在服务器收到它时反序列化吗?这样你只需要进行url字符串编码,而不是使用自己的递归url编码。