はじめに
Webアプリ制作中にHTTPについて勉強したので今回はアウトプットとして1つ記事を書いてみました。
まず、HTTPとはweb上のクライアントとサーバの通信に関するプロトコル(決めごと)のことを言います。HTTPを用いることでクライアント / サーバ間でデータのやり取りを行うことができるようになります。今回のアプリでもこのHTTP通信を用いてHTMLファイルやJSONデータの受け渡しを行っています。
HTTP通信
ここからはHTTP通信についてより深堀してみていきます。
まずはHTTP通信でのクライアントとサーバとのやり取りを見てみます。
クライアント/サーバの通信
HTTPではクライアント側からリクエストメッセージ(青色の吹き出し部分)を送り、サーバがそのレスポンス(黄色の吹き出し部分)を返す、という流れで基本的にはデータの受け渡しが行われます(下図のような感じ)。
これをより詳細に深堀するとクライアントとサーバでは下図のような処理が実行されています
簡単に説明すると、まずクライアント側でリクエストメッセージ(HTML文が欲しい、検索結果をJSON形式で欲しい等)を作成してHTTPリクエストをサーバに送信します。
そしてサーバ側ではHTTPリクエスト内の情報を取り出して必要な処理(データベースへの問合せやHTML文の生成等)を行った後レスポンスメッセージを作成してクライアントへ送信、その結果を出力するという流れで一連の動作が実施されます。
HTTPメッセージの構成
次にHTTPメッセージの中身について見ていきます。
HTTPメッセージにはリクエストとレスポンスの2種類がありますが、どちらも構成は同じです。
※ なお、HTTPメッセージはcurl -v コマンドで確認することができます。例えばgoogleのサイトにアクセスしたときのHTTPメッセージは以下のコマンドで確認できます。
curl -v https://www.google.com/
▸スタートライン
1行目はスタートラインと呼ばれHTTPのバージョンが記載されています。そしてリクエストではHTTPメソッド(GETやPOSTなど)が、レスポンスではステータスコードとステータスメッセージが合わせて記載されます。
▸HTTPヘッダ
2行目からの黄色の枠で囲まれた部分がHTTPヘッダになります。この部分にはホスト情報やHTTPボディのメタデータ(データ長やデータ形式等)が記述されています。
アプリ開発の上ではこのHTTPボディの中でも特に表現ヘッダが重要になってきます。表現ヘッダはHTTPボディに記載するデータ形式を指定する識別子で、Content-Type: に続けて指定したいデータ形式を記述します。代表例を以下に載せます。
| データ形式 | Content-Type | 補足 |
|---|---|---|
| HTMLファイル | text/html; charset=utf-8 | charsetで文字コードを合わせて指定 |
| JSONデータ | application/json | - |
| JPEGファイル | image/jpeg | - |
| csvファイル | text/csv | - |
▸HTTPボディ
HTTPヘッダから空白を1行挟んだ、赤色の枠で囲まれた部分がHTTPボディになります。名前の通り、HTTP通信でやり取りする情報の本体が格納されている場所になります。HTTPボディは必ず値が格納されているわけではなく、GETでリクエストを行ったりステータスコードのみレスポンスで返すといった処理を行った場合はHTTPボディは空の状態で通信が行われます。
以上、HTTPメッセージはこのような形で構成されていますが最後にPHPでHTTPメッセージを扱う方法について簡単に触れておきます。
【HTTPボディの読込み】
クライアントからのHTTPリクエストのボディ情報を読み込む際には以下のように記載します。
$body = file_get_contents('php://input');
php://input でリクエストのボディ部分にアクセスすることで、格納されている生データの取得を行っています。
【HTTPレスポンスの生成】
クライアントへHTTPレスポンスを送る際には以下のような形で記載します。
http_response_code($statusCode);
header('Content-Type: application/json');
echo $json;
① ステータスコードの設定
1行目のhttp_resupose_code 関数でステータスコードの指定を行います(PHPではステータスコードを明記せずにHTTPレスポンスを送るとデフォルトで200番台を返すようになっているので成功処理に関しては記載を省略することができます)。
② データ形式の指定
2行目のheader 関数でHTTPボディのデータ形式を指定します。
③ HTTPボディの記載
ステータスコードとデータ形式を指定したら最後にHTTPボディ記載を行います。例ではJSONデータをHTTPボディに格納してレスポンスしているのでecho $json と記載しています。
HTTPメソッド
HTTPを用いることでクライアント/サーバ間でデータの受け渡しが行えますが、一言にデータの受け渡しといっても様々な受け渡し方があります。
HTTPではこのデータの受け渡しの方法を指定するHTTPメソッドというものがあります。HTTPメソッドを用いることでデータの送信方法を変えたり、リクエストの内容を識別することができるようになります。HTTPメソッドの代表例を表したのが以下の表になります。
| HTTPメソッド | 意味 |
|---|---|
| GET | 指定したリソースの情報を取得する。最もよく使用されるメソッド。 |
| POST | 新しいリソースを作成する。GETと並んでよく使用されるメソッド。 |
| PATCH | 指定したリソースの一部を更新(修正)する |
| PUT | 指定したリソースをすべて更新(修正)する |
| DELETE | 指定したリソースを削除する |
この中でも特に用いられるのがGETとPOSTメソッドなのでこの2つについてより深く解説していきます。
▸GETメソッド
GETメソッドは主にサーバからデータを取得したいときに用いるHTTPメソッドになります。URLにアクセスする際には基本的にこのGETメソッドでリクエストが行われます。
GETメソッドを用いて、URLの末尾にクエリパラメータをつけてサーバから取得したい情報を指定することもできます(下のURLの赤字がクエリパラメータ)。
https://google.com**?weather=tokyo**
GETメソッドはこのようにURLにアクセスしてページのデータを取得したり、クエリパラメータをつけて欲しいデータを指定して取得する際に用います。
▸POSTメソッド
POSTメソッドは主にサーバにデータを送信したいときに用いるHTTPメソッドになります。ブログで記事を書いて投稿する、といったときに用いられます。
また、サーバからデータを取得したいときに用いられることもあります。データの取得は基本GETメソッドで行いますがクエリパラメータには字数制限があるので一度に多くの情報が欲しいというときにはPOSTで処理を行います。
さらにPOSTメソッドはHTTPボディにデータを格納するので、リクエストとしてログイン情報など外部に見られてはまずい情報の送信を行う際にも用いられます。
例えばログインを行ったのちにトップページへアクセスするようなサイトの場合、下図のようなGETメソッドでログイン情報を送るとURLに機密情報が載ってしまい非常に危険です。
そこで、このような機密性の高い情報をリクエストとして用いるときにはPOSTメソッドを使って処理を行います。HTTPボディは直接外部から見ただけでは中身まではわからず、安全にデータのやり取りを行うことができます。
このようなことからデータの登録作業時に加えて、長大なデータをやログイン情報など機密データをリクエストとして渡すときにはPOSTメソッドが用いられます。
ステータスコード
ステータスコードとはリクエストがどのような形で処理されたのかを表す3桁の数字のことでHTTPレスポンスに記載されます。例えばステータスコードが200番であれば正常に処理が終了したことを表します。
ステータスコードの最初の1桁目で処理の大枠の結果を知ることができます。例えば200番台であれば処理が成功したことを表しています。以下の表は何番台がそれぞれ何を表しているのかを表にまとめたものです。
| ステータスコード | 意味 |
|---|---|
| 1xx | 情報レスポンス(リクエストに対して処理が継続されていることを表す) |
| 2xx | 成功レスポンス(リクエストが正常に処理されたことを表す) |
| 3xx | リダイレクション(リクエストに対してリダイレクトされたことを表す) |
| 4xx | クライアントエラー(クライアント側が原因でリクエストが失敗したことを表す) |
| 5xx | サーバーエラー(サーバー側が原因でリクエストが失敗したことを表す) |
具体的なステータスコードとその意味も見てみます。主なステータスコードとその意味は以下の通りです。
| ステータスコード | 意味 |
|---|---|
| 200 | OK(リクエストが成功したことを表す。GETリクエストが成功したときによく表示される) |
| 201 | Created(リクエストが成功し新たにリソースが作成されたことを表す。POST成功時によく表示される) |
| 204 | No Content(リクエストに成功し、特に返すものがないことを表す。リソースの削除を行ったときによく表示される) |
| 301 | Moved Permanently(リクエストされたURIが変更されていることを表す) |
| 400 | Bad Request(クライアントのリクエスト内容に問題があることを表す。URIやパラメータが間違っているときなどに表示される) |
| 401 | Unauthorized(クライアントが認証なしでアクセスしたことを表す。クライアントがログインをせずにアクセスしたときなどに表示される) |
| 403 | Forbidden(クライアントにリソースの操作権限がないことを表す) |
| 404 | Not Found(リクエストされたリソースが存在しないことを表す。存在しないURIにアクセスしたときなどに表示される) |
| 500 | Internal Server Error(サーバーの内部でエラーが発生してリクエストが処理できないことを表す) |
| 503 | Service Unavailable(サーバーが一時的に利用できないことを表す。負荷が高まったりメンテナンス中のときなどに表示される) |
これらのステータスコードはHTTPレスポンスとともにクライアントへ送信される情報なのでサーバサイドの設計やコーディングを行う際には自分で何番を使用するか選択する必要があります。(ブラウザ側がすべて自動で振ってくれるわけではないので注意が必要)
まとめ
ここではHTTP通信の基礎について紹介しました。HTTPはブラウザとサーバとでデータの通信を行うためのプロトコルでありHTTPメッセージを通じて具体的な内容の受け渡しを行っていることをここでは学びました。
今回は触れませんでしたがログインなどの処理でもこのHTTPの仕組みが使われています。このことからもわかる通り、WEB開発ではHTTPの理解は非常に重要と言えます。




