
九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、これは開発者の方なら「あるある」な話だと思うのですが、たまに全く別の調べものをしていて、
「えっ、こんなやり方があるの」
ってなることもあるんじゃないでしょうか。
というのも、開発の世界は新しいものが常に登場しますし、スピードも早いのでチェックが漏れてしまっているテクノロジーが出てくるのも当然と言えば当然なことかもしれません。
そして、今回ご紹介したいのが、まさに1年ほど前に「これは知らなかった」となった
fetch API
です。
fetch API
というのは、簡単に言うと「Ajax通信」するために用意されたものでIE
を除くほぼすべてのブラウザで有効になっています。
私の場合、Ajax通信はaxios
ばかり使っていたのですが、fetch API
は純粋なJavaScript
の機能なので、<script>
タグでコードを読み込む必要がないのがメリットです。
そこで!
今回はfetch API
の基本的な使い方をご紹介します。
ぜひ楽しみながらみていきましょう
「$.ajax()
って書いてた頃が懐かしい・・・」
基本的な使い方(GET)
では、fetch
の基本的な使い方を紹介します。
次の例を見てみましょう
fetch('https://jsonplaceholder.typicode.com/posts')
.then(response => {
return response.json(); //
Promiseを返す
})
.then(data => { //
JSONデータ
console.log(data);
})
.catch(error => { //
エラーの場合
console.log(error);
});
axios
に慣れている人だと、「あれっ」と思うかもしれませんが、
then
が2つあるのは、JSONデータを取得するための正しいやり方です。
実はこの場合、1つ目のthen()
ではJSONデータを取得することはできません。なぜならresponse.json()
はPromise
だからです。
そのため、一旦return
で値を返しておき、2つ目のthen()
でやっとJSON
データが取得できる流れになります。
また、Ajax通信やthen()
でエラーが発生したら、catch()
が実行されることになります。
※なお、async
とawait
を使うと次のようにすることもできます。
(async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
if(response.ok) {
const data = await response.json(); //
JSONデータ
}
})();
パラメーターを送信する(POST, PUT, PATCH, DELETE)
例えばAjax
でPOST送信したい場合です。
まず例を見てみましょう。
//
送信データ
const data = {
keyword: 'キーワード',
orderBy: ['created_at', 'desc']
};
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST', //
メソッド ・・・ ①
headers: {
'Content-Type': 'application/json', //
データ形式 ・・・ ②
},
body: JSON.stringify(data) //
送信データ ・・・ ③
})
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.log(error);
});
各ブロックの説明は次のとおりです。
①メソッド
この部分は、次のような送信タイプを指定することになります。
- POST
- PUT
- PATCH(部分的なPUT)
- DELETE
②データ形式、③送信データ
まず、決まりごととして、②データ形式と③送信データは一致させる必要があります。
例えば、今回の例はJSON形式でのデータ送信なので、application/json
を使っていますが、ファイル送信の場合は、application/x-www-form-urlencoded
を使います。
※ファイル送信する方法は次の項目をご覧ください。
ファイルを送信する
次にファイルを送信する場合を見ていきましょう。
例えば、次のようなフォームです。
<form id="form">
<input type="text" name="email" value="test@example.com"><br>
<input type="text" name="password" value="secret"><br>
<!--
ファイル入力 -->
<input type="file" name="file">
</form>
この場合、送信データはFormData
を使い、さらにデータ形式はapplication/x-www-form-urlencoded
を使います。
const formData = new FormData(document.getElementById('form'));
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded', //
データ形式
},
body: formData //
FormData
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.log(error);
});
おわりに
ということで、今回は純粋なJavaScript
の機能、fetch()
でAjax送信する方法を紹介しました。
冒頭でも書いたとおり、特にライブラリを読み込まなくても使えるのは大きなメリットなんじゃないでしょうか。
ただ、コードを見てもらったら分かるとおり、axios
と比べるとちょっと「クセが強い」ので、最初はとっつきにくいかもしれません。
というのもaxios
の場合、次のようにthen()
とcatch()
がひとつずつですし、送信メソッドもひと目で分かるので、より直感的に使えるんじゃないでしょうか。(・・・というか、なぜfetch
もこれと同じにしなかったのか不思議なところです)
axios.post('https://jsonplaceholder.typicode.com/postsake')
.then(response => {
// 成功した時
})
.catch(error => {
// 失敗した時
});
とはいえ、新しいJavaScript
コードのサンプルではfetch
が使われているのも増えてきているので、今後のために覚えておいて損はしないと思いますよ。
ぜひ一度使ってみてくださいね。
ではでは〜
「私の開発では、まだまだ
axios
にお願いすることになりそうです」