2

これを行うとき、私はリクエストlibとpython 2.7を使用しています:

import requests

uri_params = {
    u'email': u'myEmail@domain.com',
    u'id_user': 15,
    u'user_var': {
        u'var1': u'val1',
        u'var2': u'val2',
    }
}

r = requests.get('http://google.com/',  params=uri_params)
print r.url

結果として私に与えます: http://www.google.com/?id_user=15&email=myEmail%40domain.com&user_var=var1&user_var=var2

http://www.google.com/?id_user=15&email=myEmail%40domain.com&user_var%5Bvar1%5D=val1&user_var%5Bvar2%5D=val2 (= user_var[var1]=val1&user_var[var2]=val2)の代わりに

これを処理する方法として lib を要求するかどうか知っていますか?

編集: Martijn Pieters のコードの使用方法を理解するのに数分かかりました。だから、私のようなPythonに慣れていない他の人のための最終的なコードは次のとおりです。

import requests
import urllib

def nested_object(name, mapping):
    return [(u'{}[{}]'.format(name, key), value) for key, value in mapping.iteritems()]

uri_params = [
    (u'email', u'myEmail@domain.com'),
    (u'id_user', 15),
]

uri_params.extend(nested_object(u'user_var', {u'var1': u'val1', u'var2': u'val2'}))
encoded = urllib.urlencode(uri_params)

r = requests.get('http://google.com/',  params=encoded)
print r.url
4

1 に答える 1

2

いいえ、requestsライブラリにはそれを処理する方法がありません。

application/x-www-form-urlencodedGET および POST 要求に使用されるエンコーディング標準では、1 レベルのキーと値のペアしか許可されておら、ネストされた値の標準はありません。代わりに、さまざまなフレームワークがこれを処理するために独自に発明しました。あなたは多くのバリエーションのうちの1つを見ています。

urllib.urlencode()表示される出力は、キーを複数回繰り返すことによってシーケンスを処理する関数によって作成されます。ネストされた辞書はシーケンスと見なされ、キーのみがシリアル化されます。通常、これは代わりに値のリストに使用され、複数のフォーム フィールドを同じ名前でシリアル化するときにブラウザーが行うことを模倣します。

ネストされた辞書を自分でエンコードする必要があります。

def nested_object(name, mapping):
    return [(u'{}[{}]'.format(name, key), value) for key, value in mapping.iteritems()]

キーと値のタプルのシーケンスを返します。残りの URL パラメーターは同じ形式のままにしてください。

uri_params = [
    (u'email', u'myEmail@domain.com'),
    (u'id_user', 15),
]

uri_params.extend(nested_object(u'user_var', {u'var1': u'val1', u'var2': u'val2'}))
于 2013-07-10T07:27:09.347 に答える