Java | Web 基礎・HTTP・REST:HTTP 基礎 - HTTP プロトコル概要

Java Java
スポンサーリンク

HTTP プロトコルを一言でいうと

HTTP は
「ブラウザ(クライアント)と Web サーバーが会話するための“決まりごと(プロトコル)”」
です。

ブラウザが「このページください」「このデータください」とお願いを送り、
サーバーが「はい、これが結果です」と返事をする。
この“お願い”と“返事”の形式やルールを決めているのが HTTP です。

Java で Web アプリを書くということは、
この HTTP の世界に、自分のアプリを参加させることだと思ってください。


HTTP の基本構造:リクエストとレスポンス

リクエストは「お願いの手紙」

ブラウザがサーバーに送るのが HTTP リクエストです。
中身はざっくり言うと「どの URL に」「どんな操作を」「どんな条件で」したいか、という情報です。

典型的なリクエストはこんな形をしています。

GET /users?id=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html

一行目が特に重要で、ここに
メソッド(GET)
パス(/users)
HTTP のバージョン(HTTP/1.1)
が書かれています。

その下には、追加情報(ヘッダ)が続きます。
Host はどのホスト名に対するリクエストか、
User-Agent はどんなブラウザか、
Accept はどんな形式のレスポンスを受け取りたいか、
などを伝えています。

POST などでフォームや JSON を送るときは、
この下に「ボディ」と呼ばれる本体データが付きます。

レスポンスは「返事の手紙」

サーバーがブラウザに返すのが HTTP レスポンスです。

典型的なレスポンスはこんな形です。

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234

<html>...</html>

一行目には
HTTP のバージョン(HTTP/1.1)
ステータスコード(200)
ステータスメッセージ(OK)
が書かれています。

ステータスコードは特に重要で、
200 は「成功」
404 は「見つからない」
500 は「サーバー内部エラー」
といった意味を持ちます。

その下にはヘッダが続き、
Content-Type で「中身の種類(HTML / JSON / 画像など)」
Content-Length で「データの長さ」
などを伝えます。

空行のあとに、実際の中身(HTML や JSON)がボディとして続きます。


HTTP メソッド:何をしたいのかを表す

代表的なメソッド

HTTP メソッドは、「この URL に対して何をしたいか」を表す動詞です。
特に Web アプリでよく使うのは次の 4 つです。

GET
「データを取得したい」
例:ユーザー一覧を取得、詳細を表示

POST
「新しいデータを作りたい」
例:ユーザー登録、フォーム送信

PUT
「既存データを置き換えたい」

DELETE
「データを削除したい」

Java(Spring)では、これらをアノテーションで表現します。

@GetMapping("/users")
public List<UserResponse> list() { ... }

@PostMapping("/users")
public UserResponse create(@RequestBody UserRequest request) { ... }
Java

ここで、
@GetMapping は HTTP の GET に対応し、
@PostMapping は HTTP の POST に対応しています。

HTTP のメソッドを正しく使うことは、
RESTful な API 設計の土台になります。


HTTP は「ステートレス」である

ステートレスとは何か

HTTP は「ステートレスなプロトコル」と言われます。
これは、
「サーバーは“前回のリクエストの状態”を覚えていない」
という意味です。

毎回のリクエストは、
それ単体で完結している前提です。

例えば、
1 回目のリクエストでログインして
2 回目のリクエストでマイページを表示する

という流れがあったとしても、
HTTP 自体は「この 2 つのリクエストが同じユーザーから来ている」とは知りません。

じゃあ、ログイン状態はどうやって覚えるのか?

ここで登場するのが、
クッキー(Cookie)やセッション(Session)です。

サーバーは、
ログイン成功時に「セッション ID」を発行し、
それをクッキーとしてブラウザに渡します。

ブラウザは、
次回以降のリクエストにそのクッキーを自動で付けて送ります。

サーバーは、
そのクッキーを見て「このリクエストは誰のものか」を判断します。

つまり、
HTTP 自体はステートレスだけれど、
その上に「状態管理の仕組み(セッションなど)」をアプリ側で乗せている、
という構造になっています。


HTTP バージョンのざっくりした違い

HTTP/1.1 の世界

長らく標準だったのが HTTP/1.1 です。
1 本の TCP 接続で、
リクエストとレスポンスを順番にやり取りします。

同時にたくさんのリソース(画像、CSS、JS)を読み込むときは、
複数の接続を張ったり、
ブラウザ側で工夫したりしていました。

Java の多くの Web フレームワークやサーバーは、
今でも HTTP/1.1 を基本として動いています。

HTTP/2 / HTTP/3 の世界(ざっくり)

HTTP/2 では、
1 本の接続の中で複数のリクエストを同時に流せるようになり、
ページの読み込みが高速になりました。

HTTP/3 では、
TCP ではなく QUIC(UDP ベース)を使うことで、
さらに接続の確立や再送の効率が良くなっています。

ただし、
Java で Web アプリを書くときに、
最初からこれらの詳細を意識する必要はあまりありません。

「HTTP にはバージョンがあって、
新しいほど“同じことをもっと効率よくやっている”」
くらいの理解で十分です。


Java 開発者視点での「HTTP プロトコル概要」

フレームワークが隠してくれているが、頭の中には持っておく

Spring Boot などを使うと、
HTTP の生のリクエスト・レスポンスを直接扱うことはほとんどありません。

@GetMapping
@PostMapping
@RequestParam
@RequestBody
@ResponseBody

といったアノテーションを付けるだけで、
フレームワークが HTTP の細かい部分をよしなに処理してくれます。

それでも、頭の中には

「ブラウザが HTTP リクエストを送ってくる」
「サーバーはステータスコードとヘッダとボディを返す」
「メソッド(GET/POST など)と URL で“何をしたいか”を表現する」

という HTTP の基本イメージを持っておくことが大事です。

デバッグやトラブルシュートで効いてくる

「画面が真っ白で何も出ない」
「API を叩いたら 404 が返ってくる」
「CORS エラーが出る」

こういったときに、
HTTP のリクエストとレスポンスを実際に見て、

どの URL に
どのメソッドで
どんなヘッダとボディで
どんなステータスコードとレスポンスが返ってきているか

を確認できると、
原因にたどり着くスピードが一気に上がります。


初心者がまず押さえるべき HTTP のイメージ

あなたの言葉で整理すると、こうなります。

HTTP は、
ブラウザ(クライアント)とサーバーが
リクエスト(お願い)とレスポンス(返事)をやり取りするためのルール。

リクエストには
メソッド(GET/POST など)
URL(パス)
ヘッダ
ボディ(必要なら)
があり、

レスポンスには
ステータスコード(200/404/500 など)
ヘッダ
ボディ(HTML や JSON)
がある。

HTTP 自体はステートレスだが、
クッキーやセッションを使って「ログイン状態」などをアプリ側で管理している。

Java で Web アプリを書くときは、
フレームワークが HTTP の細部を隠してくれるが、
この全体像を頭に入れておくと、
設計もデバッグも一段やりやすくなる。

もしよければ、
実際にブラウザの開発者ツールを開いて、
「ネットワーク」タブでリクエストとレスポンスを眺めてみてほしい。
気になる画面を一つ決めて、
「この画面の裏でどんな HTTP が飛んでいるか」を一緒に読み解いていくと、
HTTP の理解が一気にリアルになるから。

タイトルとURLをコピーしました