JavaScriptでPOSTリクエストを送りたい場合…
AjaxではなくFetch APIを使うことがあります。
そのとき悩むのが次のこと
POST送信時のdataパラメータの渡し方
Ajaxとは少しだけ渡し方が違うので、
記憶を整理するために方法をまとめます。
このページの目次
Ajaxだとdataに直接パラメータを渡せるが…
AjaxはHTTPリクエストを送るのに超便利です。
例えば適当なRest APIにPOST送信する場合を考えます。
▼ このコード例みたいに簡単に書ける
1 2 3 4 5 6 7 8 9 10 11 12 |
$.ajax({ type: "POST", url: "https://hoge.com/api/test", /// こんな風に直接データパラメータを渡せる data: { param1: "hoge", param2: "fuga" } }).dont((msg)=>{ console.log('msg : ', msg) }); |
上記コードのようにPOST送信のパラメータをオブジェクトとして渡せます。キー・値のペアを定義するだけだし、とても分かりやすいです。
Ajaxは直観的に分かりやすい
Ajaxと違ってFetch APIではこれができない
一方のFetch APIの場合…
先ほどのAjaxみたいなパラメータ渡しはできません。
▼ こういうコードを書くのはNG
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
fetch('https://hoge.com/api/test', { /// リクエストメソッド method: 'POST', /// NG : 期待通りに動かない! body: { param1: "hoge", param2: "fuga" } }).then(async (response)=>{ console.log('response : ',await response.json()); }).then((data)=>{ console.log('data : ', data); }).catch((error) => { console.error('error : ', error); }); |
Ajaxに慣れてると動くのを期待してしまいます。
でも残念ながらAjaxのように気が利かないので、bodyにキー・ペアのオブジェクトを渡すことはできません。そして今後も仕様が変わることはないでしょう。
そこで次から紹介する2つの方法が使えます。
方法1.FormDataでPOSTパラメータを渡す
方法の1つ目はFormDataを使うこと
これは後述の方法より少し面倒です。
▼ FormDataを使ったシンプルなPOSTリクエスト例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/// FormData作成 const formData = new FormData(); formData.append('param1', 'hoge'); formData.append('param2', 'fuga'); fetch('https://hoge.com/api/test', { method: 'POST', /// OK : FormDataでパラメータ指定 body: formData }).then(async (response)=>{ console.log('response : ',await response.json()); }).then((data)=>{ console.log('data : ', data); }).catch((error) => { console.error('error : ', error); }); |
▼ FormDataに関する詳細
FormData インターフェイスは、XMLHttpRequest.send() メソッドを用いることで簡単に送信が可能な、フォームフィールドおよびそれらの値から表現されるキーと値のペアのセットを簡単に構築する手段を提供します。これは、エンコーディングタイプを "multipart/form-data" に設定した場合にフォームが使用するものと同じ形式を使用します。
引用元 : https://developer.mozilla.org/ja/docs/Web/API/FormData
キー・値のペアセットを構築するために用意されています。普通にオブジェクトを渡せば?と思うけど、パラメータ変数を安全に構築する目的もあるかも
あとFormData.append()でファイル送信も可能です。
▼ 詳しくはFormData.append()を参照
ユーザーから選択されたFileを直接渡せるので、
自分でアレコレしなくていいのが利点かもしれません、
方法2.JSON文字列でPOSTパラメータを指定
これはAjaxに近いやり方です。
キー・値のPOSTパラメータを定義、
それを文字列化してbodyに指定する方法です。
言葉だと分かりにくいのでコード例を載せます。
▼ JSONでPOSTパラメータ指定するリクエスト例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
fetch('https://hoge.com/api/test', { method: 'POST', /// 必ずContent-Typeを指定しておく headers: { 'Content-Type': 'application/json', }, /// OK : JSONでパラメータ指定 body: JSON.stringify({ param1: "hoge", param2: "fuga" }) }).then(async (response)=>{ console.log('response : ',await response.json()); }).then((data)=>{ console.log('data : ', data); }).catch((error) => { console.error('error : ', error); }); |
上記のようにキー・値のペアオブジェクトを JSON.stringify() により文字列化、それをbodyに渡せばOKです。ただしContent-Typeとして 'application/json' の明示が必須です。
こちらはよりAjax的なので分かりやすい
POST・HTTPリクエストなんかの関連記事
ついでにPOSTリクエストの関連記事を紹介
▼ PostmanでPost送信のdataにランダム変数を使う方法
もしかしたら役立つかもしれません。
よければご覧ください。
やり方が分からないと少し戸惑うかも
以上、Fetch APIでのPOST送信のdataパラメータ設定でした。
やり方が分からないと少し戸惑うかもしれません。
個人的にはJSON文字列で渡すのが分かりやすいです。