2012-06-07 2 views
1

У меня есть много функций, которые успешно отправляют 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)) 
+0

Вы протестировали это со словарем, который имеет предполагаемую структуру, но с минимальным содержанием, чтобы гарантировать, что проблема не зависит от длины/содержимого тестовых данных? – octern

+0

Я использую этот код для тестирования существующей конечной точки API. IOW, нет другой конечной точки, которая имеет похожую структуру, но минимальный контент, как вы предлагаете. Однако все остальные конечные точки (без вложенных уровней в json) работают так, как ожидалось. И тело выше работает при подаче через Fiddler. – ftg

ответ

1

Могу ли я предложить вам сериализовать свое тело JSON и де-сериализовать, когда ваш сервер получит его? Таким образом, вам просто нужно выполнить кодировку строки url, а не использовать собственный рекурсивный URL-код.

+0

Я не уверен, что вы имеете в виду (будучи очень новым для python), но я буду немного оглядываться, чтобы посмотреть, могу ли я найти несколько примеров, чтобы попробовать. Спасибо. – ftg

+1

Это поможет вам начать работу с json http://docs.python.org/library/json.html –

+0

По существу, вы можете конвертировать или «сериализовать» простые словари python в json-строку с помощью json.dumps и unserialize обратно в словарь python с использованием json.loads. таким образом, вы можете сказать urllib.quote (json.dumps (bodytmp)) в своем запросе. И когда вы получите его в переменной, называемой «данные», вызовите json.loads (data), чтобы преобразовать ее обратно в словарь. –

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