0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Webアプリ制作中にHTTPについて勉強したので今回はアウトプットとして1つ記事を書いてみました。

まず、HTTPとはweb上のクライアントとサーバの通信に関するプロトコル(決めごと)のことを言います。HTTPを用いることでクライアント / サーバ間でデータのやり取りを行うことができるようになります。今回のアプリでもこのHTTP通信を用いてHTMLファイルやJSONデータの受け渡しを行っています。

HTTP通信

ここからはHTTP通信についてより深堀してみていきます。
まずはHTTP通信でのクライアントとサーバとのやり取りを見てみます。

クライアント/サーバの通信

HTTPではクライアント側からリクエストメッセージ(青色の吹き出し部分)を送り、サーバがそのレスポンス(黄色の吹き出し部分)を返す、という流れで基本的にはデータの受け渡しが行われます(下図のような感じ)。

image.png

これをより詳細に深堀するとクライアントとサーバでは下図のような処理が実行されています

簡単に説明すると、まずクライアント側でリクエストメッセージ(HTML文が欲しい、検索結果をJSON形式で欲しい等)を作成してHTTPリクエストをサーバに送信します。
そしてサーバ側ではHTTPリクエスト内の情報を取り出して必要な処理(データベースへの問合せやHTML文の生成等)を行った後レスポンスメッセージを作成してクライアントへ送信、その結果を出力するという流れで一連の動作が実施されます。

image 1.png

HTTPメッセージの構成

次にHTTPメッセージの中身について見ていきます。
HTTPメッセージにはリクエストとレスポンスの2種類がありますが、どちらも構成は同じです。

image 2.png

※ なお、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に機密情報が載ってしまい非常に危険です。

image 3.png

そこで、このような機密性の高い情報をリクエストとして用いるときにはPOSTメソッドを使って処理を行います。HTTPボディは直接外部から見ただけでは中身まではわからず、安全にデータのやり取りを行うことができます。

image 4.png

このようなことからデータの登録作業時に加えて、長大なデータをやログイン情報など機密データをリクエストとして渡すときには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の理解は非常に重要と言えます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?