webとは何か
HTTP、URI、HTMLの関係
REST
- クライアント/サーバー:クライアントとサーバーで処理を分離する - ステートレスサーバー:サーバーがアプリケーション状態を管理しない - キャッシュ:一度取得したリソースをクライアント側で使い回すことでサーバーとクライアントの通信回数を減らす - 統一インターフェース:インターフェースを統一する(HTTPのメソッドは8つのみ) - 階層化システム:システムを階層化することで負荷を分散させたり、アクセスを制限できる - コードオンデマンド:JavaScriptなどをサーバーからダウンロードすることでクライアントの機能を拡張できるURI
クールURIとは「変わらないURI」であり「シンプルなURI」- プログラミング言語に依存した拡張子やパスを含めない
- メソッド名やセッションIDを含めない
- URIはリソースを表現する名詞にする
HTTP
HTTPはTCP/IPをベースとしたプロトコル。 ![スクリーンショット 2018-10-08 19.27.49.png](https://qiita-image-store.s3.amazonaws.com/0/299225/051b600d-b017-b800-d462-762ed7e8dd6c.png)- ネットワークインタフェース層:物理的なケーブルやネットワークアダプタ
- インターネット層:指定したIPアドレスを送り先としてパケット単位でデータを送り出す
- トランスポート層:データの送り先に対してコネクションをはることでデータの抜け漏れをチェックする。転送するデータがどのアプリケーションに渡るかを決定するのがポート番号。サーバ側のHTTPはデフォルトで80番。
- アプリケーション層:メールやDNS、HTTPなどのインターネットアプリケーションを実現する層。
例:技術評論社のWebサイトであるgihyo.jpにアクセスした場合
クライアントは、まずDNSを使ってgihyo.jpのホスト名を名前解決し、その結果得られるIPアドレスのTCP80番ポートに接続して、リクエストを送信する。
クライアントで行われること
- リクエストメッセージの構築
- リクエストメッセージの送信
- (レスポンスが返るまで待機)
- レスポンスメッセージの受信
- レスポンスメッセージの解析
- クライアントの目的を達成するために必要な処理
画像やスタイルシートへのリンクが含まれるため何度もリクエストを発行しなければ正しくHTMLをレンダリングできない。
サーバーで行われること
- (リクエストの待機)
- リクエストメッセージの受信
- リクエストメッセージの解析
- 適切なアプリケーションプログラムへの処理の委譲
- アプリケーションプログラムから結果を取得
- レスポンスメッセージの構築
- レスポンスメッセージの送信
HTTPのステートレス性
ステートレスとは「サーバーがクライアントのアプリケーション状態を保存しない」HTTPメソッド
メソッド | 意味 |
---|---|
GET | リソースの取得 |
POST | 子リソースの作成、リソースへのデータの追加、そのほかの処理 |
PUT | リソースの更新、リソースの作成 |
DELETE | リソースの削除 |
HEAD | リソースのヘッダ(メタデータ)の取得 |
OPTIONS | リソースがサポートしているメソッドの取得 |
TRACE | プロキシ動作の確認 |
CONNECT | プロキシ動作のトンネル接続への変更 |
POSTとPUTの使い分け
POST : URIの決定権はサーバー(TwitterのようにつぶやきのURIをサーバー側が自動的に決定する場合) PUT : URIの決定権はクライアント(wikiなどのようにクライアントが決めたタイトルがそのままURIになるような場合)HTMLのフォームで指定できるメソッドはGETとPOSTの2つだけのためPOSTでPUTとDELETEを代用する方法がある。
- _methodパラメータ
input type="hidden" id="_method" value="PUT" - X-HTTP-Method-Override
X-HTTP-Method-Override: PUTという記述をヘッダに含める
べき等性と安全性
- べき等性 : ある操作を何度行っても結果が同じこと - 安全 : 操作対象のリソースの状態を変化させないことメソッド | 性質 |
---|---|
GET、HEAD | べき等かつ安全 |
PUT、DELETE | べき等だが安全でない |
POST | べき等でも安全でもない |
- GETのリクエストを何度行ったとしても結果もリソースの状態も変わらない。
- PUTとDELETEは何度送信しても結果が変わらない。例えばDELETEはリソースを削除すれば再びリクエストを送信すると404 NOT Foundが返ってくる。しかし、「リソースが削除されている」という結果は先ほどと同じ。
- POSTは複数回リクエストするとその分だけリソースの状態が変わる。そのため二重注文のような問題が起こる可能性がある。