cybozu developer network

カテゴリー内の他の記事

2016/01/10 の定期メンテナンスにおけるkintone API更新情報 Part1

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文字列に変換してから、送信することを推奨します。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
鈴木佑介

kintone.apiを利用する際のパラメータなどで下記のようにすることはあるかと思いますが、
// パラメータのみ記述
params = {app: 123, query: 'CODE = "' + code + '"'};

上記のようにしていた場合というのも修正対象になるんでしょうか?

Avatar
cybozu development team

鈴木様

developer network事務局です。

params = {app: 123, query: 'CODE = "' + code + '"'};

では、そもそもシングルクォートが含まれてしまっているので修正対象となります。

Avatar
鈴木佑介

承知しました。下記のように修正するという認識でいいのでしょうか?

params = {app: 123, query: "CODE = '" + code + "'"};

Avatar
cybozu development team

kintoneの仕様上、このケースですと code の前後にダブルクォートを付ける必要があります。
https://cybozudev.zendesk.com/hc/ja/articles/202331474

ので、下記のようにエスケープしてみてはいかがでしょうか?
params = {"app" : "123" , "query" : "CODE = \"" + code + "\""};

Avatar
鈴木佑介

おお、なるほど。
そういうことですね。承知しました!ありがとうございました!

Avatar
Shigeru SAWADA

kintone apiの場合には、修正しなくとも問題ないようですね。
http://radical-bridge.com/kintone-blog/kintone_RESTAPI_update.html

Avatar
斎藤 栄

鈴木さま、developer network事務局さま
ラジカルブリッジの斎藤と申します。

kintone.apiを利用する際のパラメータなどで下記のようにすることはあるかと思いますが、
// パラメータのみ記述
params = {app: 123, query: 'CODE = "' + code + '"'};

「kintone.apiを利用」とありますので言語はJavaScriptかと思いますが、であれば params は
JavaScriptのオブジェクトであり、REST APIにそのままの内容が渡されるわけではないと思います。
澤田さんが投稿したリンク先にあるように、kintone.apiを経由した時に、オブジェクトの内容が文字列に
置換されてREST APIにアクセスされますが、その文字列に置換される時点で、
キー及び値はダブルクォーテーションで括られるように置換されるので、従来のJavaScriptにおける
オブジェクト定義に使われているシングルクォーテーションの記述をダブルクォーテーションに
修正していく必要はないと考えます。

Avatar
鈴木佑介

澤田様
齋藤様

回答遅れてしまい、恐縮です。
外部からREST APIを叩いている場合のjsonの記述に影響があるだけで、
kintone.apiを利用している場合には、問題ないと言うことですね。

kintone.apiを経由した時に、オブジェクトの内容が文字列に
置換されてREST APIにアクセスされますが、その文字列に置換される時点で、
キー及び値はダブルクォーテーションで括られるように置換される

承知しました。
ありがとうございます。

Avatar
cybozu development team

本日お知らせを一部追記しています。(ラインフィードの部分)
他にもこちらに載せていない厳格化チェックでひっかかる例はいくつかあるので充分にご注意ください。

サインインしてコメントを残してください。