REST API と HTTP METHOD †
- 決まってないけど、伝統的にこういう使い分けでやるみたい
Entity操作 | HTTPメソッド |
Create | POST |
Read | GET |
Update | PUT |
Delete | DELETE |
- なかなか REST API を Entity操作に落とし込めないんで、そういう場合は何でも POST というのももちろんあり
Curl で POST JSON †
-新しい app を登録
$ curl -H 'Content-Type:application/json' -d "{\"name\":\"myapp\"}" http://localhost:8080/api/app | jq
{
"id": 1,
"version": "20200212",
"branchNo": 0,
"name": "myapp",
"enabled": false,
"lastupdate": 1581440955809,
"containedBy": []
}
Curl で PUT JSON †
- app#1 の enabled を true に変更する
- ミソは、true を "" で囲っていないところ。Jersey が boolean に変換してくれる。cf. Glassfish JAX-RS Mapをインタフェースにした安直な REST-API
$ curl -X PUT -H 'Content-Type:application/json' -d "{\"enabled\":true}" http://localhost:8080/api/app/1 | jq
{
"id": 1,
"version": "20200212",
"branchNo": 0,
"name": "myapp",
"enabled": true,
"lastupdate": 1581441066264,
"containedBy": []
}
Curl で GET JSON †
- 検索の前に、新しいバージョンの myapp を登録する。ただし enabled=false 状態
- myapp の(有効 enabled=true な)最新バージョンの取得
$ curl http://localhost:8080/api/app/findByName/myapp | jq
[
{
"id": 1,
"version": "20200212",
"branchNo": 0,
"name": "myapp",
"enabled": true,
"lastupdate": 1581441066264,
"containedBy": []
}
]
- 全検索
$ curl http://localhost:8080/api/app/findAll | jq
[
{
"id": 2,
"version": "20200212",
"branchNo": 1,
"name": "myapp",
"enabled": false,
"lastupdate": 1581441590281,
"containedBy": []
},
{
"id": 1,
"version": "20200212",
"branchNo": 0,
"name": "myapp",
"enabled": true,
"lastupdate": 1581441066264,
"containedBy": []
}
]
Curl で DELETE †
$ curl -X DELETE http://localhost:8080/api/app/2
$ curl http://localhost:8080/api/app/findAll | jq
[
{
"id": 1,
"version": "20200212",
"branchNo": 0,
"name": "myapp",
"enabled": true,
"lastupdate": 1581441066264,
"containedBy": []
}
]
Bash で JSON を読み取る †
- Curl の結果を一時ファイルに書き出しておき、jq コマンドで読み取るのが定石
# Create Temp File.
# Call createTmp, then the path of temp file is stored in the variable "tmpFile".
# The temp file will be removed automatically when the shell exit.
tmpAry=()
tmpFile=""
function createTmp(){
tmpFile=$(mktemp)
tmpAry+=( $tmpFile )
}
function rm_tmpfile(){
for ((i = 0; i < ${#tmpAry[@]}; i++)) {
tmpFile=${tmpAry[i]}
if [[ -f "$tmpFile" ]]
then
# echo "delete $tmpFile"
rm -f "$tmpFile"
fi
}
}
trap rm_tmpfile EXIT
#!/bin/bash
. createTmp.sh
createTmp
# ----- STEP 1 -----
echo "Create myapp"
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"name\":\"myapp\",\"enabled\":true}" \
-o $tmpFile \
http://localhost:8080/api/app 2> /dev/null
cat $tmpFile
# ----- STEP 2 -----
echo -e "\nCreate myrsc"
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"name\":\"myrsc\",\"directory\":\"/var/opt/resource/myrsc\"}" \
-o $tmpFile \
http://localhost:8080/api/rsc 2> /dev/null
cat $tmpFile
RSCID=$(jq -r '.id' $tmpFile)
# ----- STEP 3 -----
echo -e "\nRead myapp"
curl -X GET \
-o $tmpFile \
http://localhost:8080/api/app/findByName/myapp 2> /dev/null
cat $tmpFile
APPID=$(jq -r '.[0].id' $tmpFile)
echo -e "APPID:${APPID}\nRSCID:${RSCID}\n"
# ----- STEP 4 -----
echo -e "\nAppend myapp to myrsc"
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"resource\":${RSCID}, \"app\":${APPID}}" \
-o $tmpFile \
http://localhost:8080/api/con 2> /dev/null
jq . $tmpFile
# ----- STEP 5 -----
echo -e "\nFind contains apps"
curl -X GET \
-o $tmpFile \
http://localhost:8080/api/rsc/findContainsAppBinary/${RSCID} 2> /dev/null
jq . $tmpFile
- createTmp.sh で、一時ファイルを用意する
- jq で、JSON の配列を読み取るには、次のようにする
APPID=$(jq -r '.[0].id' $tmpFile)
0 個目の JSON の id に対応する値を取る
Java#Jetty