【Coreserver】curlでJSON-likeなデータをKey-Value形式でPOST

2021/10/05

UNIX

t f B! P L

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の仕様なのでしょうか。
まぁ上記コードで使えているので、問題はないです。

このブログを検索

QooQ