kintone.proxyの書き方について

お世話になります。

以下のページを参考に排他制御の処理を作成しておりますが、

https://developer.cybozu.io/hc/ja/articles/201255224-%E5%AE%89%E5%85%A8%E3%81%AB%E5%9C%A8%E5%BA%AB%E7%AE%A1%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF 

bulkRequestをkintone.proxyを使用して実行すると、

エラーも表示されず、PUT処理も実行されない状況です。

恐らくkintone.proxyの記述の誤りだと思い試行錯誤しておりますが解消できず困っております。

*kintone.proxyを使用しない場合は意図した通り動作します。

(PUT処理され排他制御も機能します)

解消方法についてご教授いただけますと幸いです。

kintone.events.on(["app.record.detail.process.proceed"], function (event) {

var body = {};
var requestParam = "xxxxxxxxx";
var query = "xxxxxxxx";
var query_en = encodeURIComponent(query);
var url = kintone.api.url('/k/v1/records', true) + requestParam + query_en;

var headers = {
"X-Cybozu-Authorization:": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Authorization": "Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": JSON.stringify("application/json")
};

return new kintone.Promise(function (resolve) {
kintone.proxy(url, "GET", headers, body, function (json) {

//~~いろんな処理~~

//PUTデータ作成
var body2 = {
"requests": [
{
"method": "PUT",
"api": "/k/v1/record.json",
"payload": {
"app": xxx,
"id": x,
"revision": x,
"record": {
"AAAAA": {
"value": aaa
},
"BBBBB": {
"value": bbb
}
}
}
}
]
};

kintone.proxy(kintone.api.url('/k/v1/bulkRequest', true), "POST", headers, body2, function (resp) {

//【こっちは上手くいく→】kintone.api(kintone.api.url('/k/v1/bulkRequest', true), 'POST', body2, function (resp) {
          //kintone.proxyの場合、「OKだよ」が表示されるがPUT処理されずエラーも出ない。
console.log("OKだよ");
resolve(event);
}, function (error) {
console.log("エラーだよ");
resolve(event);
});
});
});
return event;
});

ぱっと見、記述として2点気になるところがあります。

 

1つ目は、Content-Typeの指定についてです。この中で更に幾つかありますが、・・・

1-1 application/jsonはリクエストボディの形式を指定するものですので、kintone.proxy()を用いたGETリクエストではボディで情報を渡すことは出来ないため、URLに情報をのせることになります。言い換えると、ボディは空なので、Contetn-Typeの指定は不要ですし、kintoneのGETリクエストでボディが空にも関わらず、Content-Typeを指定するとエラーになります。

cURLでいう次の前者のリクエストは通りますが、後者はエラーになります。

curl -X GET “[https://subdomain.kintone.com/k/v1/record.json?app=271&id=1”](https://subdomain.kintone.com/k/v1/record.json?app=271&id=1"\)
-H “X-Cybozu-API-Token: XRwMSOGKaOv4YE3JCbo4wMBD1ln2Ulk6wQM6mvIA”\

curl -X GET “[https://subdomain.kintone.com/k/v1/record.json?app=271&id=1”](https://subdomain.kintone.com/k/v1/record.json?app=271&id=1"\)
-H “X-Cybozu-API-Token: XRwMSOGKaOv4YE3JCbo4wMBD1ln2Ulk6wQM6mvIA”\
-H “Content-Type:application/json”

 

ちなみに、kintone.proxy()ではGETリクエストにボディを指定することが出来ないと言いましたが、GETでボディを指定できる際のリクエスト方法はcURLでは次のようになります(ボディにクエリ情報をのせる事になるので、Content-Type:application/jsonが必要です)。

curl -X GET “[https://subdomain.kintone.com/k/v1/record.json”](https://subdomain.kintone.com/k/v1/record.json"\)
-H “X-Cybozu-API-Token: XRwMSOGKaOv4YE3JCbo4wMBD1ln2Ulk6wQM6mvIA”\
-H “Content-Type:application/json”\
-d “{"app":271, "id":1}”

 

最初のGETリクエストがエラーになってないようなので、ちょっと不思議です(今回のケースでは、認証情報以外のところは置換・隠蔽や省略なしでコード載せてもらった方がトラブルシュートしやすそうです)。後述しますが、意図したリクエスト内容になっているか、レスポンスが返って来ているかを確認出来てますでしょうか。

 

1-2 Content-Typeの指定でapplication/jsonを記述するのにJSON.stringify()を経由されてますが、引数はただの文字列なのでJSON.stringify()はあってもなくても同じだと思いまし、‘Content-Type’: 'application/json’で指定されると良いと思います。

 

2つ目は、kintone.proxy() の記述というよりは Promiseの記述についてです。return new kintone.Promise()を用いて、その中でresolve(event)も適切に指定されている様なので、return eventは不要だと思います。

 

最後に、この種のトラブルシュートとして最も大切な点として、ブラウザのdeveloper toolを使って頂きたいという点です。意図したリクエスト内容が送信されているか、正しいレスポンスが返って来ているかを確認してみてください。kintone.api()の動きを確認する方法はこちらを参考にしてもらえますし、kintone.proxy()でも基本的に同じです。ブラウザのdeveloper toolの使い方という点ではネット上に更にたくさんの情報もあります。

 

今回のここまでの情報からですと、自分であれば次の2点をdeveloper toolで確認します。

・先述した不思議を解消するために最初のGETリクエストのリクエスト内容とレスポンス内容が意図通りか確認します

・bulkRequestのPOSTについては、kintone.api()で成功してkintone.proxy()では成功してないと見えるので、その違いがヒントになりそうなので、両方のリクエスト内容とレスポンス内容を見比べます。

 

kintone.proxy() の特徴と合わせて、これら確認されてみてください。

コメントありがとうございます。

本件developer toolで調査し解消することができました。

 

kintone.proxy()を用いたGETリクエストですが、

Content-Typeに「JSON.stringify(application/json)」と記述すると、「Content-Type」の記述が無い時と同様のふるまいをすることが分かりました。

(試しに"Content-Type": “application/json” と記述するとご指摘の通りエラーになりました)

 

bulkRequestでも同様に「JSON.stringify(application/json)」と記述しておりましたが、

上記の書き方が適切ではない旨のメッセージが表示されておりましたので

“Content-Type”: “application/json” に変更したところ正常に動作しました。

 

 

確認ポイント等も教えていただきありがとうございました!

JSON.stringify() は ““application/json”” となるようですね。失礼しました。いずれにせよ、解決に至られて良かったです。