この記事では、JSONをcurlコマンドでPOST送信する例を紹介します。
今回は下記コマンドの実行例を解説します。
コマンドは長いので、バックスペースで改行しています。
$ curl -X POST -H "Content-Type: application/json" \
-d '{"ver":1.0, "id":1000,"params":{"host":"hoge","ip":"10.0.0.1"}}' \
http://127.0.0.1:8000/json_post_test
以降では、このコマンドをDjango(PythonのWebアプリケーションフレームワーク)にリクエストした際の動きを順序立てて解説します。
処理内容については、Pythonを知らない方でも分かるように説明します。
curlのurl部分を受信した際の動き(urls.py)
from django.urls import path
from . import views
urlpatterns = [
path('json_post_test', views.JsonPostTestView, name='json_post_test'),
path('hoge_hoge_post', views.HogeHogeView, name='hoge_hoge_post'),
]
まず、curlコマンドを実行すると、urls.pyというファイルに処理が送信されます。
(厳密にはその他に色々な処理を実行していますが、今回の解説では不要のため割愛)
curlで送信しているURLはhttp://127.0.0.1:8000/json_post_testなので、
path関数の第一引数がjson_post_testであるpath関数が実行され、
第二引数のviews.JsonPostTestViewが実行されます。
これが実行されると、次のviews.pyにあるdef JsonPostTestView(関数)に処理が飛ばされます。
curl -dで受け取ったデータの動き(views.py)
import json
from django.http.response import JsonResponse
@csrf_exempt
def JsonPostTestView(request):
if request.method == 'GET':
return JsonResponse({})
# JSON文字列を辞書型に変換
data = json.loads(request.body)
# 辞書型のキー値 ver, id, params, host, ip に対応するvalueを渡す
result = {"ver":data["ver"] + 1, "id":data["id"] + 10,
"host+ip":data["params"]["host"] + "_" + data["params"]["ip"]}
# JSONに変換してデータを返す
return JsonResponse(result)
urls.pyのpath('json_post_test', views.JsonPostTestView, name='json_post_test')が実行されると上記のファイルに処理が移ります。
def JsonPostTestView(request):
if request.method == 'GET':
return JsonResponse({})
JsonPostTestViewの始めに、if request.method == 'GET':という処理がありますが、これはGETメソッドを受信した時に動くものなので、POST受信時(今回のケース)では無視されます。
# JSON文字列を辞書型に変換
data = json.loads(request.body)
次に、json.loads(request.body)でcurlコマンドの -d で指定したJSONデータを受け取り、辞書型に変換しています。
JSONデータはDjangoの機能でrequest.bodyと記述することで取得できます。
json.loadsでJSONデータを辞書型に変換しています。
# 辞書型のキー値 ver, id, params, host, ip に対応するvalueを渡す
result = {"ver":data["ver"] + 1, "id":data["id"] + 10,
"host+ip":data["params"]["host"] + "_" + data["params"]["ip"]}
result部分は受けとったデータをそれぞれ処理している部分です。
data["curl -d で設定したkey"]のように記述すると、keyに対応した値を取り出すことができます。
views.pyのresult 部分では次のような処理をしています。
verに1を足し、
idに10を足し、
hostとipをアンダースコアを挟み、連結。
# JSONに変換してデータを返す
return JsonResponse(result)
その後、結果をクライアントに返しています。
{"ver": 2.0, "id": 1010, "host+ip": "hoge_10.0.0.1"}
結果、curlコマンド実行後は上記のような値が返ってきます。
関連記事
・【Python】requestsのsessionとcookiesでPOST通信を検証
・ curlコマンドでPOSTする (画面送信版)