当サイトは、アフィリエイト広告を利用しています
マイクロサービスアーキテクチャでREST APIを作ったので
REST APIやHTTPついて色々調べたことをまとめておく。
実際に実装する場合については
Pythonの軽量フレームワークであるflaskを使ったREST APIの実装方法を
下記記事で紹介しています
REST APIとはWeb APIの一つで
REST(Representational State Transfer)の原則に基づいて設計されたAPIのこと。
REST APIではリクエストのHTTPメソッドとURIでデータを操作する
RESTには4つの原則があり、この原則を満たしているAPIがREST APIになる。
情報の操作(取得、作成、更新、削除)は全てHTTPメソッド(GET、POST、PUT、DELETE)を利用すること。
インターフェースが統一されていればブラウザ・JavaScriptコード・モバイルアプリケーションなど
RESTを利用するクライアントであれば同じ方法でサーバーが呼び出せ、リソースにアクセスができるようにする。
提供する情報がURIを通して表現できること。
全ての情報はURIで表現される一意なアドレスを持っていること。
情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができること。
HTTPをベースにしたステートレスなクライアント/サーバプロトコルであること。
セッション等の状態管理はせず、やり取りされる情報はそれ自体で完結して解釈できること。
REST APIのURL,URI,エンドポイントについて例えば
https://scrawledtechblog.com/blog?flg=true&id=3
を詳しく見てみる。
分解すると
になる。
これをURL,URI,エンドポイントにわけると下記のようになる。
クエリパラメータまで全てを含んだ
がURL。
パスパラメータまでを含み、クエリパラメータを含まない
がURI。
URIと同じくパスパラメータまでを含み、クエリパラメータを含まない
がエンドポイント。
URIとエンドポイントは文脈や使われ方によって変わるので曖昧だが
個人的に同じものとして理解している
厳密にはURIとエンドポイントは異なる概念らしいが、文脈として同じものを指すこともあるらしい。
なるほど。。。わからん
REST APIを調べていると
という言葉をよく見かけたので、ちょっと調べてみた
エンドポイントはAPI連携するためのURIのこと。 ユーザー視点。
エンドポイントと同じ。
視点をAPI公開側にした場合にエントリーポイントと呼ばれる。
大きく違うのはエンドポイントのURIの決まり方が異なる。
フロントエンドとバックエンドに別れたSPAのシステムの場合
例えばデータに対する処理のURIは下記のようになることが多い。
登録処理をする場合のURI
https://scrawledtechblog.com/blog/registArticle
参照処理をする場合のURI
https://scrawledtechblog.com/blog/getArticle
更新処理をする場合のURI
https://scrawledtechblog.com/blog/updateArticle
削除処理をする場合のURI
"ttps://scrawledtechblog.com/blog/deleteArticle
上記のように処理自体にURIが紐づく形になる。
通常APIに対してREST APIは処理に対しては紐づかず
リソースに対してURLが決まる。
REST APIの場合はエンドポイントとなるURIは
下記のようになる。
https://scrawledtechblog.com/blog
ただこれだけだとなんの処理なのかわからないので 何の処理を行うかをHTTPメソッドで指定する。
つまり、REST APIは処理を
の組み合わせで判断する。 REST APIでの処理の分け方は下記のようになる。
HTTPメソッド:POST
URL :https://scrawledtechblog.com/blog
HTTPメソッド:GET
URL :https://scrawledtechblog.com/blog
HTTPメソッド:PUT
URL :https://scrawledtechblog.com/blog
HTTPメソッド:DELETE
URL :https://scrawledtechblog.com/blog
HTTP通信において、クライアントからWebサーバーの送られるのが
HTTPリクエスト。
HTTPリクエストは
で構成される。
構造としては
のように、ヘッダとボディの間に空行が入る。
言い方がリクエスト行だったりリクエストラインだったりする。
書式は
【メソッド】[空白]【URI】[空白]【HTTPのバージョン】
なる。
メソッドにはHTTPメソッド(GETとかPOSTとか)が入り、
URIにはアクセスするリソースが入る。
ヘッダーにはリクエストの詳細情報(User-Agent当)が入る。
書式は
【フィールド名】:【内容】
の形になってる。
メッセージボディには画面の入力内容など、サーバー側に渡したい情報が入る。
GETのように必要がない場合は特に何も書かれない。
リソースを識別するために必要な情報が指定される
URIのホスト名(ドメインでない)かつ、クエリパラメータでない部分のこと
https://scrawledtechblog.com/blog?flg=true&id=3
であれば「blog」がパスパラメータ。
リソースを操作して取得するのに必要な情報が指定される
?の後に指定されているもの
ルールとしては
例えば
https://scrawledtechblog.com/blog?flg=true&id=3
であれば「flg=true&id=3」がクエリパラメータ。
クエリパラメータ、クエリ文字列、クエストリング、URLパラメータなど
呼び方がたくさんある。
HTTP通信において、Webサーバーからクライアントへ返されるのが
HTTPレスポンス。
HTTPリクエストは
で構成される。
構造としては
のように、HTTPリクエストど同様にヘッダとボディの間に空行が入る。
ステータスラインにHTTPリクエスト結果が書いてある。
重要なのはステータスコードで「200」とか[404]とか
書式は
【HTTPのバージョン】[空白]【ステータスコード】[空白]【ステータスコードの説明】
なる。
※ステータスコードはググればすぐでてくるので割愛。
ヘッダーにはレスポンスの詳細情報(サーバー情報とかコンテントタイプ)が入る。
書式は
【フィールド名】:【内容】
の形になってる。
HTTPレスポンスにはリクエストで要求された相手がほしかった情報が入っている
例えば
のような感じ。
今まで何となくイメージでHTTPを使ってきたが、REST APIを設計するにあたり
HTTP周りの用語や構造を調べて整理してみた。