JSにてkintone proxyを用いたAPIを使用し、GETメソッドで、JSON形式のリクエストを送信すると、"不正なリクエスト"となってしまい、データの取得がうまくいきません。
うまくいかなかったAPIは次のものです。
・ユーザーエクスポート API(JSON出力)
・レコードの一括取得(クエリで条件を指定)
kintone proxyを使わなければデータの取得はできます。
また、PUTメソッドでのJSONリクエストを送る更新APIなどは
成功します。
どうして、GETの場合だけダメなのか迷走しています。
どなたかご教示いただけるとありがたいです。
こんにちは。
大内@cstapです。
kintone proxyを使用しているスクリプトではどのような処理を記載しているのでしょうか。
もし、JSON形式のリクエストを投げる処理がproxyを経由したスクリプト内に記載されているのであれば、認証情報がうまく渡っていないため権限で弾かれているか、XSSが疑わしいように思います。
また、"不正なリクエスト"というエラーメッセージは何から出力されていますか?
もしAPIからのレスポンスボディにあるJSONの"message"の事を指しているのであれば、HTTPステータスコードや"code"などをお知らせ頂ければ何かの突破口になるかも知れません。
大内@cstap様
kiyoです。
回答いただき有り難うございます。
質問の内容が不鮮明ですみません。
リクエストのスクリプトは下記の様な形式です。
kintone.proxy(
‘https://xxx.cybozu.com/v1/users.json’,
‘GET’,
{
‘X-Cybozu-Authorization’: ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’,
‘Content-Type’: ‘application/json’
},
{
“ids”: [userId]
},
function (body, status, headers) {
var json = JSON.parse(body);
このようなスクリプトで要求を行うと、返却されたbodyに下記のようなデータが格納されております。
“{“message”:“不正なJSON文字列です。”,“id”:“1505999166-1364138092”,“code”:“CB_IJ01”}”
また、statusは400でした。
ご助力をお願い致します。
kiyoさんにご提示頂いたスクリプトを試してみたところ、こちらでも確かに再現しました。
メッセージ等から判断すると、どうやら引数に指定したJSONが正常にデコード出来ていない事象のようですね。
試しに臭うところをJSON.stringifyでエスケープしてみたら、取得出来ました。
ご意図通りのスクリプトになっているか分かりませんが、検証に使ったものをまるっと添付しますのでご確認ください。
サブドメインや認証情報等は適宜置き換えくださいませ。
(function () {
“use strict”;
kintone.events.on(‘app.record.index.show’, function (event){
kintone.proxy(
‘https://xxx.cybozu.com/v1/users.json’,
‘GET’,
{
“X-Cybozu-Authorization”: “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”,
“Content-Type”: JSON.stringify(“application/json”)
},
{
“ids”: [1,2,3]
},
function (body, status, headers) {
var json = JSON.parse(body);
console.log(json);
}
);
});
})();
大内@cstap様
kiyoです。
貴重な情報をいただきありがとうございます。
試したところ、エラーとはならず、データが取得できました!
ただ、JSONによってidsを指定しておりますが、
全件数のデータが取得されてしまうようです。
結局のとろこ、JSONの中身が伝達されていないとの
ことなのでしょうか。
kiyoさん、返答遅れてすみません。
こちらでも色々調べてみましたが、kintone.proxy はGETメソッドのときにはrequest bodyを送信していないようです。
またContent-typeの件も実は指定しなくても通るらしく、また先日の方法は壊れた値を送っているため無視されていたというのが本当のところのようです。
結局のところ、User APIをkintoneのjsから利用する公式的な方法はないようですが、代替手段としてjQuery.ajaxを利用してみたところうまくいきましたのでお知らせします。
先日と同じく、検証に使ったスクリプトを添付しますので試してみてください。
(function () {
“use strict”;
kintone.events.on(‘app.record.index.show’, function (event){
jQuery.ajax({
url: kintone.api.url(‘/v1/users’),
type: ‘GET’,
data: {
REQUEST_TOKEN :kintone.getRequestToken(),
ids:[“1”, “2”],
}
}).done(function (e) {
console.log(e);
});
});
})();
たびたびすみません。
こちらでもいけました。
こっちのほうがkintone jsっぽいかと思います。
(function () {
“use strict”;
kintone.events.on(‘app.record.index.show’, function (event){
kintone.api(
‘/v1/users’,
‘GET’,
{
REQUEST_TOKEN : kintone.getRequestToken(),
ids: [“1”, “2”],
offset: 0
},
function (e) {
console.log(“Success”);
console.log(e);
},
function(resp) {
console.log(“Error!!!”);
console.log(resp);
}
);
});
})();
大内@cstap様
kiyoです。
細かなご指導ありがとうございます。
ご提供いただきましたソースにて実行したところ、
下記のようなエラーとなりました。
Object {message: “不正なPOSTアクセスです。画面をリロードしてください。”, id: “1505999166-1250292509”, code: “CB_CS01”}
GETしているはずなのに、POSTとして怒られております。。。
もう少し、試行錯誤してみます。