web-dev-qa-db-ja.com

JSON-RequestをFlaskにCurl経由で送信

flaskのような非常に単純なポストルートをセットアップします。

from flask import Flask, request

app = Flask(__name__)

@app.route('/post', methods=['POST'])
def post_route():
    if request.method == 'POST':

        data = request.get_json()

        print('Data Received: "{data}"'.format(data=data))
        return "Request Processed.\n"

app.run()

これは、コマンドラインから送信しようとしているcurlリクエストです。

curl localhost:5000/post -d '{"foo": "bar"}'

それでも、「Data Received: "None"」と出力されます。したがって、渡されたJSONを認識しません。

この場合、json形式を指定する必要がありますか?

16
OhMad

get_json ドキュメントによると:

[..] mimetypeがapplication/jsonでない場合、関数はNoneを返しますが、これはforceパラメーターによってオーバーライドできます。

したがって、着信要求のmimetypeをapplication/jsonに指定します。

curl localhost:5000/post -d '{"foo": "bar"}' -H 'Content-Type: application/json'

またはforce=Trueを使用してJSONデコードを強制する:

data = request.get_json(force=True)

Windowsでこれを実行する場合(PowerShellではなくcmd.exe)、JSONデータの引用を単一​​から変更する必要もあります。二重引用符への引用:

curl localhost:5000/post -d "{\"foo\": \"bar\"}" -H 'Content-Type: application/json'
14
randomir