Webを支える技術 - HTTP、URI、HTML、そしてREST[書評]


Webを支える技術 - HTTP、URI、HTML、そしてREST』を2年ぶりに読んで、あらためて大切だと思った部分を中心にまとめます!

2年前には考えもしなかった部分が実はかなり大切という、気付きをさせてくれる良本です。定期的に読むようにします! !


🚌 RESTについて

RESTの特徴(制約)は次のとおり。

クライアント/サーバ : ユーザーインターフェイスと処理を分離する
ステートレスサーバ : サーバ側でアプリケーションの状態を持たない
キャッシュ : クライアントとサーバ間の通信回数・量を減らす
統一インターフェイス: GET、POSTなど限定されたインターフェースで操作する
階層化システム : システムをいくつかの階層に分離するアーキテクチャ
コードオンデマンド : サーバからコードをダウンロードして、クライアントで実行する

RESTfulなWebサービスの性質

アドレス可能性: URIさえあればリソースを一意に指し示すことができる
接続性: リソースをリンクで接続し、1つのアプリケーションをなす
統一インターフェース: GET/POST?PUT/DELETEなどのメソッドで構成される
ステートレス性: サーバ側でクライアントの状態を管理しない(cookieが普及したため優先度低)

😸 URIについて

URIが変わるとそのページにリンクを貼っていたページで「リンク切れ」が起こります。これが定常化すると、ハイパーメディアシステムの根幹を揺るがす事態になってしまいます。そのため、『変わらないURIこそ、最上のURIである』と考えられています。URIはリソースの名前であり、寿命が長いことを意識して変わらない、シンプルなURIを設計することが大切です。

🐠 TCP/IPとは

インターネットのネットワーク・プロトコルは次のような階層型になっています。

1) アプリケーション層(HTTP, NTP, SSH, SMTP, DNS)
メールやDNS、HTTPなどの具体的なインターネットアプリケーションを実現する

2) トランスポート層(UDP, TCP)
TCP/IPにおけるTCPの部分。相手とコネクションを貼って、データ野抜け漏れをチェックして、データの到達を保証します。1-65535までのポートがある。

3) インターネット層(IP)
TCP/IPにおけるIPの部分。指定したIPを送り先として、パケット単位でデータをやりとりする

4) ネットワークインタフェース層(Ethernet)
物理的なケーブルやネットワークアダプタに相当

🏀 HTTPメソッド

代表的なHTTPメソッド

GET: リソースの取得
POST: リソースの作成・追加
PUT: リソースの更新・作成
DELETE: リソースの削除
HEAD: リソースのヘッダ(メタデータのみ)の取得
OPTIONS: リソースがサポートしているメソッドの取得

POSTとPUTの使い分け

POSTとPUTの両方がリソースの作成に対応しています。両者の違いの設計上の指針としては、POSTの場合はリソースのURIの決定権がサーバサイドにあります。一方で、PUTの場合はURIをクライアントが決定します。

べき等性と安全性

べき等性と安全性の定義は次のとおり。

べき等性: ある操作を南海行っても結果が同じこと
安全性: 操作対象のリソースの状態を変化させないこと

上記をうまえて、HTTPメソッドに当てはめると次のような特徴をもつ。

GET, HEAD => べき等かつ安全
PUT, DELETE => べき等だが安全でない
POST => べき等でも安全でもない

これらの特徴を踏まえて、リソース設計を行うべきである。

🎳 HTTPヘッダ

HTTPヘッダの概略

HTTPヘッダの概略は次のとおり。

概要: 
* メッセージのボディ部に対する付加的な情報(メタデータ)
* メデイアタイプや言語タグなどの情報を参考にしてクライアントが挙動を変化させる。

具体的な利用例:
* リソースのアクセス権を設定する認証
* クライアントとサーバの間の通信回数・量を減らすためのヘッダ

HTTPヘッダ: サーバが一方的に決める情報

基本的な情報。

日時: グリニッジ標準時(GMT)
Content-Type: メデイアタイプを指定する
charsetパラメータ: 文字エンコーディングを指定する
言語タグ: リソース表現の自然言語を指定する

必要に応じて送付する情報。

Content-Length: ボディの長さを指定する
チャンク転送: ボディを分割して転送する
認証: Basic認証やDigest認証に関する情報
キャッシュ:
    Pragma: キャッシュの抑制
    Expires: キャッシュの有効期限を示す
    Cache-Control: 詳細なキャッシュ方法を指定する
    条件付きGet: 
        If-Modified-Since: リソースの更新日時の条件
        If-None-Match: リソースのETagを条件にする
Content-Disposition: サーバがクライアントに対してリソースの提示をする
Slug: ファイル名のヒントを指定する

HTTPヘッダ: クライアントとやりとりして決める情報

1) Accept: 処理できるメディアタイプ(優先度も送付)
2) Accept-Charset: 処理できる文字エンコーディング(優先度も送付)
3) Accept-Language: 処理できる言語(優先度も送付)

🤔 JSON

👽 JSONに組込み用意されているデータ型

オブジェクト: 名前と値の集合。ハッシュのこと。
配列: 順序を持った値の集合
文字列: 二重引用符(")で囲った文字列
数値: 整数 or 浮動小数点
ブーリアン: true(真)・false(偽)を取るブーリアン型
null: かならず小文字

JSONPについて

Ajaxで用いるXMLHttpRequestというJavaScriptモジュールは同一サーバ内でしか通信できません。理由は別のサーバと通信できてしまうと、知らない間に不正なサーバにデータを送信できるという、セキュリティ上の問題が発生するからです。

この対策として、HTMLのscriptタグでJavaScriptのファイルを読み込んで、その中に書いてある関数をクライアントが任意のタイミングで呼び出すことで、データを取得する「JSONP」という形式があります。

このJSONPにより、クロスドメイン通信を実現できます。

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍