Webを支える技術
概要
HTTP、URI、HTML、そしてREST
実戦的なWebサービスの設計指針
なぜWebはこんなにも成功したのか
WEBのアーキテクチャスタイル
新システム設計時には下記、RESTアーキテクチャスタイルから必要な機能を選択する。
機能 | 内容 | 利点 |
---|---|---|
クライアント/サーバ |
クライアント:ユーザインタフェース サーバ:データストレージ に役割を分離する |
マルチプラットフォーム (PC、携帯、ゲーム機) サーバの助長化 |
ステートレスサーバ | サーバ側でクライアントの状態を管理しない | サーバの実装を簡略化できる Cookieを用いると複雑化する |
キャッシュ | リソースを再利用する | 通信量・回数低減 |
統一インタフェース | GET、POST等8つのメソッドに固定 | シンプル 独立性向上 |
断層化システム | システムを断層化(分離)する | ロードバランサ、プロキシ等の別システムを拡張できる |
コードオンデマンド | スクリプトプログラムをサーバからダウンロードしてクライアントで実行する | クライアント側のみでの複雑な処理が可能 |
URI
URIを変わりにくくするためには
プログラミング言語に依存した拡張子、パスを含めない
https://office-yone.com/servlet/LoginServlet
メソッド名、セッションIDを含めない
https://office-yone.com/login.do?action=show
https://office-yone.com/login.jsp?jsessionid=99999
リソースを名詞に
URIのユーザビリティ
URIをシンプルに短くする事で、
・タイプミスの軽減
・メディアでの露出のし易さ
・経費削減
等が見込める
不透明性
↓ 想像
本来アクセスされたくないリソースにアクセスされる恐れが高まる
HTTP
TCP/IP
HTTPはTCP/IPが動作する事を前提に動作する
層 | プロトコル | 処理内容 |
---|---|---|
アプリケーション層 | HTTP、SSH、SMTP、DNS | 接続~送受信~切断 |
セッション層 | ||
トランスポート層 | UDP、TCP | IPから送信されたパケットの到達処理 |
ネットワーク層 | IP | パケットを宛先へ送信 |
物理層/データリンク層 | イーサネット | 電気信号を伝達 |
同期型
HTTPは以下の方式を採用しており、レスポンスを取得するまでは待機し続ける。
クライアント/サーバ方式
リクエスト~レスポンス
リクエスト/レスポンスメッセージ
HTTPリクエストメッセージ
「HTTPプロトコル/HTTPリクエスト」参照
HTTPレスポンスメッセージ
「HTTPプロトコル/HTTPレスポンス」参照
ステートレス
ステートフル | ステートレス | 備考 | |
---|---|---|---|
クライアントの状態 アプリケーション状態 |
記憶する | 記憶しない | |
通信量 | 少 差分のみリクエストする |
多 常に状態をリクエストする |
|
負荷 | 高 | 低 | 認証時等 |
スケールアウト | × | ○ | |
実装 | 複雑 | 単純 |
メソッド
メソッド | 処理内容 | べき等 | 安全性 |
---|---|---|---|
GET | リソースの取得 | ○ | ○ |
POST | リソースの作成、追加、他 | × | × |
PUT | リソースの更新、作成 | ○ | × |
DELETE | リソースの削除 | ○ | × |
HEAD | リソースのヘッダ(メタデータ)取得 | ○ | ○ |
OPTIONS | リソースがサポートするメソッドの取得 | ○ | ○ |
TRACE | 試験用 | ||
CONNECT | プロキシ接続設定 |
べき等
常に取得できる結果が同一である事
PUT、DELETEを複数回実行した場合、1回目で更新対象が変化して2回目で更新が失敗したとしても、更新したという結果が得られる
安全性
リソースが変化しない事
ステータスコード
HTTPヘッダ
メタ情報を記述する部分(≠body)
ヘッダ情報からプログラムの挙動を決定する
(主にサーバ)
メディアタイプ
bodyの内容の種類を示す
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
ファイル形式 | 一般的な拡張子 | MIMEタイプ | デフォルト文字コード charset未指定時 |
---|---|---|---|
テキスト | .txt | text/plain | ISO 8859-1 ※英数字、記号から成る (日本語無し) |
テキスト | .csv | text/csv | |
HTML文書 | .htm .html | text/html | |
スタイルシート | .css | text/css | |
JavaScript | .js | text/javascript | |
VBScript | .vbs | text/vbscript | |
CSS | .css | text/css | |
XML文書 | .xml | text/xml(非推奨) | |
GIF画像 | .gif | image/gif | 無し |
JPEG画像 | .jpg .jpeg | image/jpeg | |
PNG画像 | .png | image/png | |
JSON文書 | .json | application/json | |
CGIスクリプト | .cgi | application/x-httpd-cgi | |
Word文書 | .doc | application/msword | |
PDF文書 | application/pdf | ||
JavaScript | .js | application/javascript | |
XML文書 | .xml | application/xml |
無し XML宣言部での定義推奨 <?xml version="1.0" encoding="utf-8" ?> |
XHTML文書 | .xml | application/xhtml+xml |
エンコーディング
charset=utf-8
charset=sjis