外部の API (kintone.proxy)のPOSTのリクエストボディが送れません

外部の API を実行する

↑を参考にkintone.proxyをPOSTで実装しました。

 

const header = {
            'Authorization': 'Bearer ' + freeeAccessToken,
          'Content-Type': 'multipart/form-data',
};
const body = {
            'company_id': Number(freeeCompanyId),
            'receipt': receiptBody.toString()
          };
          console.log(body);
          // 証憑データ登録APIを呼び出す
        await kintone.proxy(endPointUrl , 'POST', header, body).then(async function(response) {
            if (!response) return;
            console.log(response);
(以下略)

しかし、

'{"status_code":400,"errors":[{"type":"validation","messages":["company_id, receipt が指定されていません。"]}]}', 

で返ってきてしまいます。

    リクエストボディ
何も指定しない場合は {} を指定してください。
HTTP メソッドに POST や PUT を指定したときだけ送信されます。
HTTP メソッドが GET や DELETE のリクエストで、リクエストボディを指定したい場合には、url のクエリ文字列として指定してください。

とリファレンスにありますが、POSTでもurlのクエリ文字列で送信されてしまいます。

なぜこのような挙動をするのでしょうか?

何か考えられることがありましたらご教示いただけると幸いです。

連投されているのでさぞお困りだろうと思いますが、要件だけ連投されても見ている方は判断できません。とはいえようやく何をされたいのかが分かりました。freeeのファイルボックスアップロードでしょうか。

リクエストヘッダはどうなっていますか?

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

リクエストヘッダはこのようになっております。

const header = {
            'Authorization': 'Bearer ' + freeeAccessToken,
            'Content-Type': 'multipart/form-data',
          };

顕夫 さま

当方でもfreeeとの連携を構築していますが、信憑ファイルのアップロードに限り、サーバーサイドからの実行でないと難しいという認識をしています。

ヘッダーに記載されている通り、multipart/form-data形式で送信する必要があり、フォームデータオブジェクトをkintone.proxy()で送信することは基本的にできません。kintoine.proxy.upload()はオプションが追加できないので同じく難しいです。例外的にテキストファイルはkintone.proxy()で送信することが可能みたいですが(参考)。

XMLHttpRequestであればフォームデータオブジェクトを送信することは可能ですが、今度はfreeeのCORS的に難しいため、クライアントサイドのJavaScriptでは難しいと思います。

mls-hashimotoさま

>信憑ファイルのアップロードに限り、サーバーサイドからの実行でないと難しい

ありがとうございます。

そして『何故できないのか』の技術的な理由も詳しくご説明いただいて理解を深めることができました。

どれだけgoogle検索してもchatGTPに聞いても上手く行かずに

髪の毛が全てハゲちからるのではないかと悩んでいたので、

本当にありがとうございます。

上長に相談いたします。

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