使用kintone REST API判断应答的值的技巧

cybozu发表于:2017年01月25日 15:18:29更新于:2019年01月31日 15:39:59

概要

这次我们将以实际发生的问题作为范例,讲述如何修改代码。
想必大家一定有过使用REST API来获取记录(GET)的情况吧。
kintoneAPI一次可以GET的记录上限值500件(2015年8月现在),
处理500件以上记录的情形,需要使用循环来获取余下的记录。

接下来让我们来看一下发生问题的代码的范例。

出问题的范例

while (!loopendflg) {
    var query = encodeURIComponent('order by 记录编号 asc limit 100 offset ' + offset);
    var appUrl = kintone.api.url('/k/v1/records') + '?app=' + kintone.app.getId() + '&query=' + query;
    // 执行同步请求
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", appUrl, false);
    xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    xmlHttp.send(null);
    //获取到的记录放在数组里
    if (xmlHttp.responseText !== '{"records":[]}') {
        var respdata = JSON.parse(xmlHttp.responseText);
        for (var i = 0; respdata.records.length > i; i++) {
            records.push(respdata.records[i]);
        }
        offset += respdata.records.length;
    }else {
        loopendflg = true;
    }
}

是什么问题呢!?

上面的代码使用应答的字符串来判断循环的结束。(12行)
但是,由于2015年7月的更新,在应答里加了"totalCount"元素,
应答的结果变成了 “{"records":[],"totalCount":null}” ,变成了无法比较的状态。

由于应答是使用json形式返回的,推荐parse后使用 “records.length”,作为数据而不是文字串来处理。

推荐的范例

while (!loopendflg) {
    var query = encodeURIComponent('order by 记录编号 asc limit 100 offset ' + offset);
    var appUrl = kintone.api.url('/k/v1/records') + '?app=' + kintone.app.getId() + '&query=' + query;
    // 执行同步请求
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", appUrl, false);
    xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    xmlHttp.send(null);
    //获取到的记录放在数组里
    var respdata = JSON.parse(xmlHttp.responseText);
    if (respdata.records.length > 0) {
        for (var i = 0; respdata.records.length > i; i++) {
            records.push(respdata.records[i]);
        }
        offset += respdata.records.length;
    }else {
        loopendflg = true;
    }
}

最后

当更新后,应答里追加附带信息的情形,像上面这样直接使用应答结果的字符串是非常危险的。
请一定要先parse以后作为数据来处理。

另外,下面链接的文章,可作为参考写出更为现代的代码。

希望对kintone的学习有帮助。