curlでJSON-likeなデータをKey-Value形式でPOST
例えば、以下のようなデータをcurlコマンドでPOSTしたいとします。
{
"account" : "xxxxxxxxxxxx",
"server_name" : "xxx.yyy.zzz",
"api_secret_key" : "xxxxxxxxxxxx",
"param" : {
"addr" : "xxx.xxx.xxx.xxx"
}
}
まんまCoreserver/XreaのAPI(sshを許可するIPアドレスを登録するAPI)なのですが、サンプルは見るからにJSONなのに JSON形式へ変換せず、全て「POSTのKey,Value形式」で送信 という謎の制約があります。
「JSON形式へ変換せず」とあるので、当然Headerで Content-Type: application/json
を指定してしまうとNG。
そのため、デフォルトの content-type application/x-www-form-urlencoded
(Key,Value形式)で送ることになりますが、この場合、ネストされている部分(「param, addr」の部分)をどう表現すればいいのでしょうか。
コード
curl -X POST \
-d "account=xxxxxxxxxxxx" \
-d "server_name=xxx.yyy.zzz" \
-d "api_secret_key=xxxxxxxxxxxx" \
-d "param[addr]=xxx.xxx.xxx.xxx" \
"https://api.coreserver.jp/v1/tool/ssh_ip_allow"
これで送れました。
param[addr]
の部分ですね。
そのままでええんかい!
サーバー側はどうなっているのか
ちなみに上記のようなデータをPOSTされたサーバー側はどうなっているのでしょうか。
当然、Coreserverの中身はわからないですが、Pythonのbottle.pyでローカルでサーバーを立てて、受信したデータを確認してみます。
https://bottlepy.org/docs/dev/
POSTで受け取ったKey,Valueを出力してみます。
from bottle import request, route, run
@route("/test", method='POST')
def test():
for key in request.forms.keys():
print(key, request.forms.get(key))
return "OK"
run(host='localhost', port=8080, debug=True)
サーバー側の出力
account xxxxxxxxxxxx
server_name xxx.yyy.zzz
api_secret_key xxxxxxxxxxxx
param[addr] xxx.xxx.xxx.xxx
param[addr]
そのものが文字列になっていますね…?
どうやら、httpやpostやcurlの仕様ではなく、単にKeyが階層を表すような見た目の文字列になっているだけのようです。
そういうCoreserverの仕様なのでしょうか。
まぁ上記コードで使えているので、問題はないです。
0 件のコメント:
コメントを投稿