REST APIによるレコードの削除について

アプリA のレコード登録時に、アプリB へレコードを新規登録/更新/削除を行います。
アプリA の利用ユーザーが、アプリB への権限がない場合もあるため、アプリB の APIトークンにレコード閲覧・追加・編集・削除の権限を与えて、kintone.proxy() で REST API を呼んでいます。

新規登録、読み出し、更新は問題なく行えるのですが、削除がどうしてもできません。原因がわかりましたらご教授ください。

const apiUrl = kintone.api.url('/k/v1/records.json', true);
const query = `?app=45&ids[0]=9`;
const header = {
	'X-Cybozu-API-Token': API_TOKEN,
	'Content-Type': 'application/json',
};
resp = await kintone.proxy(apiUrl + query, 'DELETE', header, {});

上記コードは、
{
“code”: “CB_IL02”,
“id”: “iDrZ2QPcSFbhOc2yFtRS”,
“message”: “不正なリクエストです。”
}
というエラーになります。
試しに、curl で以下を実行すると、正常に削除できます。

curl -X DELETE "https://xxxx.cybozu.com/k/v1/records.json" \
  -H 'X-Cybozu-API-Token: API_TOKEN' \
  -H 'Content-Type: application/json' -d '{ "app": 45, "ids": [9] }'

こんにちわ。
kintone.proxyはkintone外部のAPIを使う場合に使用します。
外部のAPIを実行する - cybozu developer network

アプリは違えど同じkintoneなら下記のような感じでいかがでしょうか?

(function () {
  "use strict";

  // レコードの表示イベント
  kintone.events.on("app.record.detail.show", async function (event) {
    const appId = 45; // アプリID
    const recordId = [9, 10, 11]; // 削除するレコードID
    const apiToken = 'YOUR_API_TOKEN'; // APIトークン

    // kintone APIのURLを取得
    const url = kintone.api.url('/k/v1/records', true);
    const headers = {
      "X-Cybozu-API-Token": apiToken,
      "Content-Type": "application/json"
    };

    // 削除するレコードの情報を設定
    const body = {
      app: appId,
      ids: recordId
    };

    try {
      // レコード削除のリクエストを送信
      const response = await fetch(url, {
        method: 'DELETE',
        headers: headers,
        body: JSON.stringify(body)
      });

      // レスポンスが正常でない場合はエラーをスロー
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }

      // レスポンスデータを取得
      const data = await response.json();
      console.log('Record deleted successfully:', data);
    } catch (error) {
      // エラーメッセージをコンソールに表示
      console.error('Error deleting record:', error);
    }
  });
})();

3 Likes

おはようございます

ご教授ありがとうございます。
kintone.api と kintone.proxy しか頭にありませんでした!
早速試してみます。

うまくいきました!
ありがとうございました。

しかし、このアプリのJS全体のコードとしては、自アプリの特定のフィールドと相手先アプリの特定のフィールドとの比較により、
レコード追加・レコード更新・レコード削除を行うものですが、
レコード検索・取得(GET)、レコード追加(POST)・レコード更新(PUT)は proxy() で問題なく行えており、レコード削除(DELETE)のみダメだった理由が不明です。
これについては、また自分で調べてみます。

とりあえず、他の 3つの proxy() を fetch() に変えて、問題なければそれで完成とします。
ありがとうございました。

補足です。

同じ kintone のゲストスペース内のアプリからも実行する場合があり、

const url = kintone.api.url(‘/k/v1/records’, true);

では、「 /guest/123/ 」が入ってしまうので、やむを得ず

const url = ‘https://xxxxx.cybozu.com/k/v1/records’;

に変えました。

こんにちは。
解決した後にすみません。
kintone.proxy で DELETE のみダメだった理由についてですが、
リクエストボディを指定しない状態で、“Content-Type” を
指定したことが原因かと思われます。

リクエストヘッダーから “Content-Type” を削除することで、
エラー回避することができるかと思いますよ。

3 Likes

ありがとうございます!!

試してみたところ、kintone.proxy() で Content-Type を削除したら正常に削除できました。
盲点でした。
ありがとうございます。

2 Likes

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。