2016年1月10日の定期メンテナンスの、kintone API の更新に関する情報をお知らせします。
処理の高速化のため一部のライブラリをグローバルスタンダードなものへ変更します。それに伴い以下に記載するような変更があります。
本アップデートは2015年12月13日に予定しておりましたが、「kintone on cybozu.com」のリリースが延期となった影響で、
2016年1月10日のアップデート後での更新に変更されています。
対象となるAPI
- REST API 全般
変更される仕様
- JSONの形式がRFC4627に準拠します。RFC4627の形式に沿わない文字列を送信した場合、以下のようなレスポンスが返されます。
{"message":"不正なJSON文字列です。","id":"1505999166-1126250715","code":"CB_IJ01"}
- 変更によりエラーになるJSONのサンプル例
//末尾に余計な","を含む {"ids":[1,2],} //キー、またはバリューの文字列をシングルクォートで囲む {'ids':[1,2],'size':'1'} //Cスタイルの複数行コメント(/**/)、またはC++スタイルの行コメント(//)を含む {"ids":[1,2]/*comment*/} //ラインフィード {"message":"This is Line Feed Sample"}
- 上記JSONサンプルを正しく記述すると下記のようになります
//末尾の余計な","を除去 {"ids":[1,2]} //キー、またはバリューの文字列をダブルクォートで囲む {"ids":[1,2],"size":"1"} //Cスタイルの複数行コメント(/**/)、またはC++スタイルの行コメント(//)を除去 {"ids":[1,2]} //ラインフィード {"message":"This is \n Line Feed Sample"}\
実際にエラーがおきた例
ここでは実際にエラーがおきた事例を紹介します。
12月アップデート版環境でエラーがおきたコード
var postdata = '{"__REQUEST_TOKEN__":"' + kintone.getRequestToken() + '","app":"' + kintone.app.getId() + '","record":{"text":{"value":"This is \n Line Feed Sample"}}}'; var xhr = false; if(typeof ActiveXObject != "undefined"){ try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xhr = false; } } if(!xhr && typeof XMLHttpRequest != "undefined") { xhr = new XMLHttpRequest(); } xhr.open('POST', '/k/v1/record.json'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { console.log('success'); } else { console.log('error occured.'); } } } xhr.send(postdata);
よって、リクエスト文字列で送る際は下記のように対処します。
改修例
var postdata = { "__REQUEST_TOKEN__":kintone.getRequestToken(), "app":kintone.app.getId(), "record":{ "text":{ "value":"This is \n Line Feed Sample" } } } var xhr = false; if(typeof ActiveXObject != "undefined"){ try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xhr = false; } } if(!xhr && typeof XMLHttpRequest != "undefined") { xhr = new XMLHttpRequest(); } xhr.open('POST', '/k/v1/record.json'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { console.log('success'); } else { console.log('error occured.'); } } } xhr.send(JSON.stringify(postdata));
上記のように文字列で送る場合、サンプル例(それ以外にも厳格化により対応が必要な記述はあります)のような部分を書き換える必要があります。
※JSON文字列に変換してから、送信することを推奨します。
kintone.apiを利用する際のパラメータなどで下記のようにすることはあるかと思いますが、
// パラメータのみ記述
params = {app: 123, query: 'CODE = "' + code + '"'};
上記のようにしていた場合というのも修正対象になるんでしょうか?
鈴木様
developer network事務局です。
params = {app: 123, query: 'CODE = "' + code + '"'};
では、そもそもシングルクォートが含まれてしまっているので修正対象となります。
承知しました。下記のように修正するという認識でいいのでしょうか?
params = {app: 123, query: "CODE = '" + code + "'"};
kintoneの仕様上、このケースですと code の前後にダブルクォートを付ける必要があります。
https://cybozudev.zendesk.com/hc/ja/articles/202331474
ので、下記のようにエスケープしてみてはいかがでしょうか?
params = {"app" : "123" , "query" : "CODE = \"" + code + "\""};
おお、なるほど。
そういうことですね。承知しました!ありがとうございました!
kintone apiの場合には、修正しなくとも問題ないようですね。
http://radical-bridge.com/kintone-blog/kintone_RESTAPI_update.html
鈴木さま、developer network事務局さま
ラジカルブリッジの斎藤と申します。
「kintone.apiを利用」とありますので言語はJavaScriptかと思いますが、であれば params は
JavaScriptのオブジェクトであり、REST APIにそのままの内容が渡されるわけではないと思います。
澤田さんが投稿したリンク先にあるように、kintone.apiを経由した時に、オブジェクトの内容が文字列に
置換されてREST APIにアクセスされますが、その文字列に置換される時点で、
キー及び値はダブルクォーテーションで括られるように置換されるので、従来のJavaScriptにおける
オブジェクト定義に使われているシングルクォーテーションの記述をダブルクォーテーションに
修正していく必要はないと考えます。
澤田様
齋藤様
回答遅れてしまい、恐縮です。
外部からREST APIを叩いている場合のjsonの記述に影響があるだけで、
kintone.apiを利用している場合には、問題ないと言うことですね。
承知しました。
ありがとうございます。
本日お知らせを一部追記しています。(ラインフィードの部分)
他にもこちらに載せていない厳格化チェックでひっかかる例はいくつかあるので充分にご注意ください。