10

私はAPIラッパーに取り組んでいます。私が構築しようとしている仕様には、次の要求が含まれています。

curl -H "Content-type:application/json" -X POST -d data='{"name":"Partner13", "email":"example@example.com"}' http://localhost:5000/

このリクエストは、送信されたヘッダー/パラメーターなどを正確に確認するためにセットアップした小さなテストサーバーから次のレスポンスを生成します。この小さなスクリプトは以下を生成します:

uri: http://localhost:5000/,
method: POST,
api_key: None,
content_type: application/json,
params: None,
data: data={"name":"Partner13", "email":"example@example.com"}

上記は、小さなテスト スクリプトにヒットしたときに、Python スクリプトで作成する結果です。

私はこれまでに使用した中で最も美しい HTTP ライブラリである python requests モジュールを使用しています。だからここに私のpythonコードがあります:

uri = "http://localhost:5000/"
headers = {'content-type': 'application/json' }
params = {}
data = {"name":"Partner13", "email":"example@exmaple.com"}
params["data"] = json.dumps(data)
r = requests.post(uri, data=params, headers=headers)

とてもシンプルなもの。ヘッダーを設定し、POST パラメーターの辞書を作成します。そのディクショナリには、サーバーに送信するデータの JSON 文字列である「data」というエントリが 1 つあります。それから私はポストに電話します。ただし、私の小さなテスト スクリプトが返す結果は次のとおりです。

uri: http://localhost:5000/,
method: POST,
api_key: None,
content_type: application/json,
params: None,
data: data=%7B%22name%22%3A+%22Partner13%22%2C+%22email%22%3A+%22example%40example.com%22%7D

したがって、基本的に、data パラメーターで送信したい json データは urlendcoded されています。

これを修正する方法を知っている人はいますか?リクエストのドキュメントに目を通しましたが、送信データを自動 urlencode しない方法が見つからないようです。

どうもありがとう、ケビン

4

2 に答える 2

9

data キーワードのオブジェクトを作成するときは、変数に json.dumps(data) の結果を割り当てるだけです。

また、HTTP POST は url パラメータとリクエスト本文のデータの両方を受け入れることができるため、requests.post 関数には「params」という名前のキーワード引数があるため、読みやすくするために別の変数名を使用する方がよい場合があります。リクエストのドキュメントでは変数名「payload」が使用されているため、それを使用します。

data = {"name":"Partner13", "email":"example@exmaple.com"}
payload = json.dumps(data)
r = requests.post(uri, data=payload, headers=headers)
于 2013-04-01T06:32:58.857 に答える
5

リクエストは、ここでデータとして渡された辞書を自動的に URL エンコードします。John_GG のソリューションが機能するのは、'data' フィールドに JSON エンコードされた文字列を含む辞書を投稿するのではなく、JSON エンコードされた文字列を直接渡すだけだからです。文字列は自動的にエンコードされません。リクエストでのこの動作の理由を理解しているとは言えませんが、それが何であるかは関係ありません。私が見つけたこの動作をオフに切り替える方法はありません。

頑張ってね、ケビン。

于 2013-04-01T15:30:02.287 に答える