curl で /app/acl.json を呼び出して権限を更新しようとすると CB_IJ01「不正なJSON文字列です。」となる

こちらの記事を読んで、大量に作られたkintoneアプリの権限設定を

シェルスクリプトで実施したいと考えています。

https://cybozudev.zendesk.com/hc/ja/articles/201941844

 

アプリの権限の取り出しはできています。

権限を設定するために、取得したJSONを加工し、PUTするのですが、CB_IJ01「不正なJSON文字列です。」というレスポンスが返ってきます。

 

$curl -H “${API_HEADER}” -H “Content-type: application/json” -X PUT -d ‘${PUTDATA}’ “${API_URL}/app/acl.json?app=${APPID}”

{“code”:“CB_IJ01”,“id”:“1505999166-1372214989”,“message”:“不正なJSON文字列です。”}

$

 

PUTDATAの内容は、acl.jsonから受け取ったJSONからrevision削除と、entity要素の追加を行ったもので、jqやJSON Validator等では、問題ないと扱われるものなのですが、不正なJSONと返され、行き詰っています。

確認ポイントなどをご指導いただけないでしょうか?

 

実行環境で  -d ‘${PUTDATA}’  のエスケープに失敗していたりするのを想像しますが、cURLコマンドですと実際にリクエストしている内容を確認するのが難しい面もありますので、PUT時のURLをRequestBinに差し替えて確認してみるのは一つ切り分け方法だと思います。こちらにあるように成功ケース(今回だと比較対象としてPOSTMANでの成功ケースを作る感じです)と比較するという方法です。

ご返答ありがとうございます。

その後3つほど試してみましたが、エラー内容が違うもののダメなことには変わりがないようです。

$ curl -H “${API_HEADER}” -H “Content-type: application/json” -X PUT -F “file=@put.json” “${API_URL}/app/acl.json?app=${APPID}”
{“code”:“CB_IJ01”,“id”:“1505999166-1514891638”,“message”:“不正なJSON文字列です。”}
$ curl -H “${API_HEADER}” -H “Content-type: application/json” -X PUT --upload-file put.json “${API_URL}/app/acl.json?app=${APPID}”
{“code”:“CB_VA01”,“id”:“1505999166-1515014531”,“message”:“入力内容が正しくありません。”,“errors”:{“app”:{“messages”:[“必須です。”]}}}
$ curl -H “${API_HEADER}” -H “Content-type: application/json” -X PUT -d “file=@put.json” “${API_URL}/app/acl.json?app=${APPID}”
{“code”:“CB_IJ01”,“id”:“1505999166-1515109175”,“message”:“不正なJSON文字列です。”}

POSTMANの方も試してみます。

app/acl.jsonのリクエストだとすると、-Fや–upload-file等のコマンドオプションをとりうることはありませんね。一般的なcURLコマンドの使い方という点からContent-type:application/jsonとも矛盾していますし。この3パターンにおける「不正なJSON文字列」の原因はまさにContent-Type:application/jsonでありながら、形式がkintoneの仕様に則っていない、もしくはJSON文字列になっていないというケースだと思われます。

 

ちなみに、次のシンプルケースはリクエスト通りました。

 

curl -X PUT “https://subdomain.cybozu.com/k/v1/app/acl.json” \
-H “X-Cybozu-Authorization: authToken” \
-H “Authorization: Basic basicToken” \
-H “Content-Type:application/json” \
-d “{"app":421,"rights":[{"entity":{"type":"CREATOR"},"appEditable":true,"recordViewable":true,"recordAddable":true,"recordEditable":true,"recordDeletable":true,"recordImportable":true,"recordExportable":true},{"entity":{"type":"GROUP","code":"everyone"},"appEditable":false,"recordViewable":true,"recordAddable":false,"recordEditable":false,"recordDeletable":false,"recordImportable":false,"recordExportable":false}]}”

サンプルまでありがとうございます。

POSTMANであーでもない、こーでもないとやっていたところでした。

頂いたサンプルも確認してみます。

@Ryu Yamashita

サンプルのコマンドラインのパラメータをしっかり確認させていただいたところ、原因が判明しました。

それに対応した修正を行って実行したところ、無事Revisionが返ってきました。

 

> PUTDATAの内容は、acl.jsonから受け取ったJSONからrevision削除と、entity要素の追加を行ったもので

という状態がそもそもAPIの要件を満たしておらず、appパラメータがJSON内から漏れておりました。

URLで ?app=xxx  と指定していた為、これでいいと思い込んでいたところに問題がありました。

くだらない躓きにお付き合いいただきましてありがとうございました。

 

アプリIDをクエリで渡されていたのは気付いたのですが、PUTでは無視されていたので原因に関連しないかと私も思い込んでいました。

幾らか要因があったようですね。ちなみに、アプリIDだけであれば必須の項目ですので、少しわかりやすい次のメッセだったかと思います。

“message”: “入力内容が正しくありません。”,
“errors”: {
“app”: {
“messages”: [
“必須です。”
]
}
}

 

何にせよ解決されて良かったです。