GET リクエストって何をしているのか
まず「GET リクエスト」とは、
“サーバーにデータをください、とお願いするためのリクエスト” です。
- 今日の天気を教えて
- ユーザー一覧をちょうだい
- 記事の詳細を見せて
みたいな「情報を取得する」目的で使う HTTP メソッドが GET。
JavaScript の世界では、これを fetch を使って行います。
ここが重要です。
GET リクエストは「何かを変える」のではなく「情報を取りにいく」もの。
データの追加・更新・削除ではなく、「読み取り専用」のつもりで使うのが基本です。
fetch で GET リクエストを送る基本形
一番シンプルな GET の書き方
fetch に URL だけ渡すと、それは「GET リクエスト」になります。
const response = await fetch("https://example.com/api/users");
JavaScriptこの一行で、
「https://example.com/api/users に、GET リクエストを飛ばしてきて」とブラウザに指示しています。
fetch は非同期なので、普通は async / await とセットで使います。
async function loadUsers() {
const response = await fetch("https://example.com/api/users");
}
JavaScriptここで返ってくる response は「レスポンス全体」です。
まだ JSON の中身そのものではありません。
JSON を取り出すまでの 2 段階
GET で JSON をもらう基本パターンは、ほぼこの形に落ち着きます。
async function loadUsers() {
const response = await fetch("https://example.com/api/users");
const data = await response.json();
console.log(data);
}
JavaScript1 行ずつ噛み砕きます。
1 行目の fetch(...) で、「サーバーにデータください」とリクエストを送る
それを await して、レスポンス(Response オブジェクト)を response に受け取る。
2 行目の response.json() で、「レスポンスボディを JSON として解釈してね」とお願いする
これも非同期なので await して、やっと data に「普通の JS オブジェクト」としてデータが入る。
3 行目以降で、その data を好きに使う(表示したり、画面に出したり)。
ここが重要です。
GET のときでも、「fetch → Response → JSON の中身」という 2 段階構造 になっていることを、しっかり意識してください。
fetch の戻り値が、いきなり JSON ではない点が最初のつまずきポイントです。
HTTP エラーをちゃんと見る:response.ok と status
fetch は「404 でも 500 でも」一応成功扱いになる
ここは初心者が 99% 引っかかるポイントです。
const response = await fetch("https://example.com/api/users");
JavaScriptこの fetch は、
- サーバーが 404(見つからない)を返しても
- 500(サーバーエラー)を返しても
基本的には「Promise を resolve して response を返してしまう」性質があります。
つまり、HTTP 的に失敗していても、JavaScript 的には「一旦成功しました」と扱われる のです。
本当にエラーで reject されるのは、
- ネットワークが完全に繋がらない
- CORS などでブラウザがブロックした
など、「通信そのものが成り立たない」ような場合です。
だから自分で ok / status をチェックする必要がある
GET リクエストで安全に処理するなら、こういう形が「ちゃんとした版」です。
async function loadUsers() {
try {
const response = await fetch("https://example.com/api/users");
if (!response.ok) {
throw new Error("HTTPエラー: " + response.status);
}
const data = await response.json();
console.log("ユーザー一覧:", data);
} catch (err) {
console.error("通信に失敗しました:", err);
}
}
JavaScriptresponse.ok は、ステータスコードが 200〜299 のときに true になる便利フラグです。
200〜299 は「成功系」の範囲なので、「サーバーもちゃんと OK 返してる?」をチェックするときに使えます。
response.status は、数字のステータスコード(200, 404, 500 など)が入っています。
if (!response.ok) { throw ... } としておけば、
HTTP 的にエラーのときに自分で例外を投げて、下の json() には進まず、catch に飛ばせます。
ここが重要です。
GET リクエストを書くときは「fetch が成功したか?」だけではなく、「サーバーが成功ステータスを返したか?」も必ず見ること。response.ok はそのための入口で、エラーなら例外を投げて catch でまとめて扱う、という型を体に染み込ませてください。
クエリパラメータ付きの GET(?page=1 のようなやつ)
URL にパラメータを付けて条件を指定する
GET リクエストでは、よく「クエリパラメータ」と呼ばれる追加情報を URL のあとに付けます。
例えば、
https://example.com/api/users?page=2&limit=10
これは、「2 ページ目を 10 件ずつでください」のような意味かもしれません。
JavaScript から書くときも、基本は「文字列として URL を組み立てる」だけです。
const page = 2;
const limit = 10;
const url = `https://example.com/api/users?page=${page}&limit=${limit}`;
const response = await fetch(url);
JavaScriptURLSearchParams を使って少し綺麗に書く
パラメータが増えてくると、手書きで ? や & をつなぐのがつらくなります。
そのときによく使うのが URLSearchParams です。
const params = new URLSearchParams({
page: 2,
limit: 10,
keyword: "taro",
});
const url = "https://example.com/api/users?" + params.toString();
const response = await fetch(url);
JavaScriptURLSearchParams は、オブジェクトから page=2&limit=10&keyword=taro のような文字列を作ってくれます。
ここが重要です。
GET リクエストで「条件付きでデータを取る」ときは、クエリパラメータで条件を表現するのが基本 です。
JavaScript からは「URL を文字列として組み立てる」だけですが、パラメータが増えたら URLSearchParams を使うと心が平和になります。
then / catch で書く GET(Promise チェーン)
async / await の裏側で何が起きているか
同じ GET 処理を、あえて then / catch で書いてみるとこうなります。
fetch("https://example.com/api/users")
.then((response) => {
if (!response.ok) {
throw new Error("HTTPエラー: " + response.status);
}
return response.json();
})
.then((data) => {
console.log("ユーザー一覧:", data);
})
.catch((err) => {
console.error("通信に失敗しました:", err);
});
JavaScript1 つ目の then で response を受け取り、ok をチェックしてダメなら throw。
OK なら response.json() を return して、2 つ目の then に data が渡されます。
どこかで throw されたり、fetch が失敗したりすると、最後の catch に飛びます。
async / await 版と対応させてみると、やっていることは同じなのが分かると思います。
ここが重要です。
GET リクエストを async / await で理解しておけば、
then / catch のコードを見ても「これは fetch → ok チェック → json → 使用 → エラーハンドリングだな」と読み解ける ようになります。
まずは async / await を軸に覚えておくと良いです。
実務で必ず出会う壁:CORS とブラウザの制限
コードは合っているのにエラーが出る…の典型
GET を練習していると、こんなエラーに出会うことがあります。
「CORS policy により云々…」のようなメッセージです。
これは、ブラウザのセキュリティ機能(CORS)が、
「この JavaScript から、そのサーバーへのアクセスを許していないよ」と言っている 状態です。
この場合、
- fetch の書き方をいじっても直らない
- サーバー側が「このオリジン(ドメイン)からのアクセスを許可しますよ」と設定してくれないと解決しない
という性質があります。
「自分のせいか、サーバーの制限か」を分けて考える
コードを書いていて GET が失敗したとき、
まずはこの 2 つを切り分けることが大切です。
URL がそもそも間違っている、サーバーが 404/500 を返している
→ 自分の側(URL・エンドポイントの間違い)の可能性が高い。
CORS エラーが出ている
→ サーバー側の設定(Access-Control-Allow-Origin など)の問題なので、フロント側の JavaScript で直せない。
ここが重要です。
GET リクエストが失敗しても、それが「fetch の書き方のせい」とは限りません。
「自分のバグ」と「サーバー・CORS 側の事情」を分けて理解できると、デバッグで無駄にハマらなくなります。
初心者として「GET リクエスト」で本当に押さえてほしいこと
GET は「サーバーから情報を取得する」ためのリクエストで、fetch(url) と書けば基本的に GET になる。
戻ってくるのは JSON ではなく Response オブジェクトなので、response.json() で中身を取り出す 2 段階がある。
response.ok / response.status を使って、「サーバーが本当に成功を返しているか」を自分で確認する。
エラーなら例外を投げて catch でまとめて扱う形を覚えると、GET のエラーハンドリングが安定する。
条件付き GET(検索やページング)は、クエリパラメータ(?page=2&limit=10 など)を使う。
パラメータが増えてきたら URLSearchParams で文字列を組み立てるとスッキリ書ける。
async / await 版で書ければ、then / catch 版の Promise チェーンも理解できる。
どちらも「fetch → ok チェック → json → データを使う → エラー処理」という流れは同じ。
ここが重要です。
GET リクエストは、フロントエンドとバックエンドが最初に「握手」する場所です。
コードを書くときには、
「サーバーに何をお願いしているのか?」
「サーバーからどんな形で返してもらいたいのか?」
「失敗したらどう振る舞うべきか?」
を日本語で説明できる状態を目指してください。
そのうえで fetch → response → json → 使用 のパターンを繰り返し書いていくと、非同期の GET 通信は自然と怖くなくなっていきます。
もし練習するなら、例えばこういうことをやってみてください。
- ダミーの URL でもいいので、
fetch → ok チェック → json → console.logの形を何度か書いてみる。 - クエリパラメータ付きの URL を自分で文字列連結してみて、その後
URLSearchParams版にも書き換えて、どちらが読みやすいか比べてみる。 - 同じ処理を async / await 版と then / catch 版で両方書いてみて、「中で何が起きているか」を自分の言葉で説明してみる。
そうやって「自分の頭で理解した fetch & GET の型」を一度作ってしまうと、その後の API 通信全般が一段クリアに見えてきます。
