2021.02.28   2021.06.04

curlコマンドでPOSTする (JSON版)

Linux    


この記事では、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)

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)

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する (画面送信版)

参考サイト

・ Python + Django でJSONの送受信

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信