TypeScriptにおけるFetch/XMLHttpRequest
この記事ではTypeScriptにおけるFetch/XMLHttpRequestについて説明します。
Fetch API
とXMLHttpRequest
の使い方や違いについて学べます。
YouTube Video
TypeScriptにおけるFetch/XMLHttpRequest
TypeScriptにおけるHTTPリクエストは、主にFetch API
とXMLHttpRequest
の2つを利用して行われます。TypeScriptを使うことで、これらのAPIで非同期通信を行う際に、リクエストやレスポンスの型チェックを導入でき、より安全なコードを書くことができます。以下では、それぞれの使い方を紹介します。
Fetch API
Fetch API
は、PromiseベースのAPIであり、シンプルに非同期通信(HTTPリクエスト)を行うために使われます。TypeScriptでは、fetch
メソッドを使ってリクエストを行い、レスポンスを型安全に処理できます。
基本的な使い方
以下は、GET
リクエストを使用した基本的な例です。
1const url = 'https://jsonplaceholder.typicode.com/posts';
2
3fetch(url)
4 .then(response => {
5 if (!response.ok) {
6 throw new Error('Network response was not ok');
7 }
8 return response.json(); // Parse the response as JSON
9 })
10 .then(data => {
11 console.log(data);
12 })
13 .catch(error => {
14 console.error('Fetch error:', error);
15 });
- このコードは、指定したURLに
GET
リクエストを送り、取得したレスポンスをJSONとして解析してコンソールに出力する処理を行います。
TypeScriptでの型安全なデータ処理
fetch
メソッドのレスポンスは型が不明確なので、レスポンスの型を明示的に定義することで、TypeScriptの型チェックを活用できます。
1// Define the type for the response data
2interface Post {
3 userId: number;
4 id: number;
5 title: string;
6 body: string;
7}
8
9const url = 'https://jsonplaceholder.typicode.com/posts';
10
11fetch(url)
12 .then(response => response.json())
13 .then((data: Post[]) => {
14 data.forEach(post => {
15 console.log(`Title: ${post.title}`);
16 });
17 })
18 .catch(error => {
19 console.error('Error fetching data:', error);
20 });
- このコードは、
fetch
で取得したデータにPost
型を適用し、型安全にレスポンスを処理して各投稿のタイトルをコンソールに出力します。
POST
リクエストの例
データをサーバーに送信する場合、POST
メソッドを使います。ボディにJSONを送信するためには、headers
とbody
を指定します。
1const postData = {
2 title: 'foo',
3 body: 'bar',
4 userId: 1
5};
6
7fetch('https://jsonplaceholder.typicode.com/posts', {
8 method: 'POST',
9 headers: {
10 'Content-Type': 'application/json'
11 },
12 body: JSON.stringify(postData)
13 })
14 .then(response => response.json())
15 .then(data => {
16 console.log('Created post:', data);
17 })
18 .catch(error => {
19 console.error('Error posting data:', error);
20 });
- このコードは、
POST
リクエストでJSON形式のデータをサーバーに送信し、そのレスポンスをJSONとして受け取ってコンソールに出力します。
非同期関数(async
/await
)を使ったfetch
TypeScriptでasync
/await
を使うと、非同期処理をよりシンプルに記述できます。
1// Define the type for the response data
2interface Post {
3 userId: number;
4 id: number;
5 title: string;
6 body: string;
7}
8
9async function fetchPosts() {
10 try {
11 const response = await fetch('https://jsonplaceholder.typicode.com/posts');
12 if (!response.ok) {
13 throw new Error('Network response was not ok');
14 }
15 const data: Post[] = await response.json();
16 console.log(data);
17 } catch (error) {
18 console.error('Fetch error:', error);
19 }
20}
21
22fetchPosts();
- このコードは、
async
/await
構文を用いて非同期的に投稿データを取得し、レスポンスをPost[]
型として処理してコンソールに出力します。
XMLHttpRequest
XMLHttpRequest
は、古いAPIであり、Fetch API
に比べてやや複雑ですが、ブラウザの互換性やより高度な制御が必要な場合に使われることがあります。
基本的なXMLHttpRequest
の使い方
以下は、GET
リクエストを使った例です。
1const xhr = new XMLHttpRequest();
2xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts', true);
3
4xhr.onreadystatechange = function () {
5 if (xhr.readyState === 4 && xhr.status === 200) {
6 const data = JSON.parse(xhr.responseText);
7 console.log(data);
8 }
9};
10
11xhr.send();
- このコードは、
XMLHttpRequest
を使って指定したURLにGET
リクエストを送り、レスポンスをJSONとして解析してコンソールに出力します。
POST
リクエストの例
データをサーバーに送信する場合は、open
メソッドでPOST
を指定し、send
でデータを送信します。
1const xhr = new XMLHttpRequest();
2xhr.open('POST', 'https://jsonplaceholder.typicode.com/posts', true);
3xhr.setRequestHeader('Content-Type', 'application/json');
4
5const postData = JSON.stringify({
6 title: 'foo',
7 body: 'bar',
8 userId: 1
9});
10
11xhr.onreadystatechange = function () {
12 if (xhr.readyState === 4 && xhr.status === 201) {
13 console.log('Created post:', xhr.responseText);
14 }
15};
16
17xhr.send(postData);
- このコードは、
XMLHttpRequest
を使ってJSON形式のデータをPOST
リクエストでサーバーに送信し、作成されたデータのレスポンスをコンソールに出力します。
XMLHttpRequest
でのエラーハンドリング
onerror
イベントを使うことで、リクエストエラーを処理できます。
1const xhr = new XMLHttpRequest();
2xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts', true);
3
4xhr.onerror = function () {
5 console.error('Request failed');
6};
7
8xhr.onload = function () {
9 if (xhr.status === 200) {
10 console.log('Response:', xhr.responseText);
11 } else {
12 console.error('Error:', xhr.status);
13 }
14};
15
16xhr.send();
- このコードは、
XMLHttpRequest
でGET
リクエストを実行し、onerror
でリクエストエラーを処理しつつ、成功時や失敗時のレスポンスを適切にログ出力します。
Fetch API と XMLHttpRequest の比較
特徴 | Fetch API | XMLHttpRequest |
---|---|---|
モダンなAPI | ○ | × |
Promiseサポート | ○ | × |
可読性 | 高い(async /await と相性が良い) |
低い(コールバックが多くなる) |
ブラウザ互換性 | 一部の古いブラウザではサポートされていない | すべての主要ブラウザでサポート |
進捗状況の取得 | △(ReadableStream を使って可能) |
○(onprogress イベントが使える) |
エラーハンドリング | エラーはPromiseチェーンでキャッチ | onerror を使う必要がある |
まとめ
TypeScriptでは、Fetch API
を使うことで、非同期リクエストを簡潔に記述し、型安全なコードを書けます。一方、XMLHttpRequest
は古いAPIですが、特定の状況下ではまだ使用されることがあります。基本的には、シンプルでモダンなFetch API
を利用することが推奨されますが、ブラウザ互換性や進捗状況の取得が必要な場合には、XMLHttpRequest
も検討できます。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。