勉強会
ちょっと業務でRESTfulなAPIを作成する必要が出てきました。
3/14 (水) にこの本使って勉強会開くのでぜひ。 そのための予習メモ。
WWW (World Wide Web)
- 1960年代に登場したが、初期は孤立したネットワークとして存在した(軍事、科学分野)。
- 1980年代までは欧州原子核研究機構 (CERN) 等専門の研究機関で使用されるのみであった。
- 1989年のTim Berners-Leeが Hyper Text Transfer Protocol (http) を発明したことにより、インターネット上で文章を共有できることになったことで世界中でWWWが普及した。
URL (Uniform Resource Locator)
- インターネット上のリソースのアドレス。
- web上のやり取りは基本的にrequestとresponseからなり、クライアントが送ったrequestに対し、サーバーがresponseを返す。
- URLはどのようにアクセスするかを規定するscheme、サーバーのhostname、及びそのサーバーにおけるpathから成る。
Internet Protocol Suite
- client と serverを接続する方式、webページの読み込みに関するプロトコルをinternet protocol suiteと呼ぶ。
- DNSがドメイン名を解釈し、IPアドレスに変換する。ドメイン名はヒトが解釈しやすいように使用されている。
- IPアドレスが取得されると、Transmission Control Protocol (TCP) というプロトコルを介して接続が構築される。
HTTP Verbs
- HTTP では、リソースに対して実行したいアクションを示す一連のリクエストメソッドを定義している。
- Create/Read/Update/Delete (CRUD) の機能は、それぞれ POST/GET/POST/DELETEのリクエストメソッドに対応している。
endpoint
- webサイトはHTML、CSS、Javascript等から構成されるが、web APIの場合、それらの代わりにリクエストメソッドに対応したエンドポイントを持つ。
- APIを使用したデータの公開にはJSON形式が頻繁に用いられ、Django REST FrameworkのデフォルトでもJSON形式が採用されている。
HTTP
- HTTPは、TCP接続が確立された2つのコンピュータ間でのrequest/responseによるプロトコル
- 全てのHTTPメッセージはrequest/responseのステータス行、ヘッダー、ボディーからなる以下のような構成をとっている。
- webページがHTML、CSS、画像から構成されている場合、それぞれに対しrequest/responseが必要となるため、完全なwebページのレンダリングには3つのrequest/responseを終える必要がある。
HTTP/1.1 200 OK Date: Sun, 11 Jan 2004 16:06:23 GMT Server: Apache/1.3.22 (Unix) (Red-Hat/Linux) Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT ETag: "1dba6-131b-3fd31e4a" Accept-Ranges: bytes Content-Length: 4891 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html <!DOCTYPE html> <html> : </html>
stateless
- statelessな接続とは、どのrequest/responseも以前のrequest/responseとは完全に独立した関係になっている接続方式を指す。この接続では過去のイベントによるメモリが確保されていない。
- stateを管理することは現代のwebアプリケーションにとって非常に需要なもの。ログイン履歴、ショッピングカート等を保持できるのはstateの管理ができているおかげ。
- 昨今のモダンなwebフレームワーク(React、Angular、Vue等)では、こうしたstateをserver側でなくclient側に保持するようになった。
- httpを使用した接続ではあくまでstatelessになるため信頼性の面では優れているが、単一のrequest/response外のデータを使用するようなやり取りはできない。
RESTfulなAPIとは
REpresentational State Transfer (REST) は、2000年にRoy Fieldingによって提案された。 RESTfulなAPIとして、最低でも以下の3つが守られていることが基準になっている。
- HTTPのようにstatelessなプロトコルである。
- 一般的なHTTP verbs (POST/PUT/UPDATE/DELETE) を網羅している。
- データをJSON若しくはXML形式で返す
設計側にとっても、利用者にとっても共通認識として基準を設けることは重要である。