疑問に思ったこと
疑問に思ったことと調べた結果・分かったこと
REST APIとは何か
RESTの原則に則って構築されたWebAPI
Representational State Transfe
アドレス可能性(Addressability)
提供する情報をURIで表現できること
全ての情報はURIで表現される一意なアドレスを持っていること
ステートレス性(Stateless)
HTTPをベースにしたステートレスなクライアント/サーバプロトコルであること
セッション等の状態管理はせず、やり取りされる情報はそれ自体で完結して解釈できること
接続性(Connectability)
情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができること
統一インターフェース(Uniform Interface)
情報の操作(取得、作成、更新、削除)は全てHTTPメソッド(GET、POST、PUT、DELETE)を利用すること
URL/URIですべてのリソースを一意に識別する
アドレス可能性
提供する情報をURIで表現できること
結果はHTTP 経由で、JSON、HTML、XLT、プレーンテキストのいずれかの形式で送信される
標準的なデータフォーマット(XMLやJSON)を扱うことで、他システムとの連携が容易になる。
RESTなAPIはリソースに対応づいてURIが決まり、処理にはURIは対応づかない
RESTなエンドポイントと処理の例
/api/v1/users
/api/v1/users/100
/api/v1/users?id=100
usersやusers/100(idが100のユーザー)に対してGET/POST/DELETE/PUTなどのHTTPメソッドで操作を行う
idが100のユーザーを参照したい.js→const res = await fetch('/api/v1/users/100, { method = "GET"});
RESTじゃないエンドポイントの例
/api/v1/getUser
/api/v1/users/create
URIに動詞は含まない
/api/v1/users/create → /api/v1/usersにPOSTメソッドで操作する
何が嬉しいか?
RESTの原則に則って開発されたWebAPIであれば、規律が生じ、APIを利用する開発者が楽に使える
ブラウザへURIを入力するだけでリソースの参照ができる
ステートレスであり、サーバ・クライアント間で何も共有しないため、負荷に応じたスケーラビリティを向上することができる
GraphQLとは何か?
クライアントとサーバー間の通信を行うときに利用するクエリ言語
Java,Go,JS,Python,Rubyなど主要な言語で書くことができる
特徴
欲しいデータだけを取得することができる
必要な情報しか通信が行われないので余分な通信が行われない
抽象的なコードとは?
抽象的 ↔︎ 具体的
→具体的なコード
code:具体的なコード
// ID:1のユーザーの所持金50GをID:2のユーザーに移行する
function trancferGold() {
// user1から50G引く
const user1 = User.find({id: 1});
user1.gold -= 50;
User.save(user1);
// user2に50G足す
const user2 = User.find({id: 2});
user2.gold += 50;
User.save(user2);
}
具体的じゃないコード
code:具体的じゃないコード
// 引数に金額と送金するユーザーのID,受け取るユーザーのIDを受け取り
// 送金するユーザーから引数で受け取った金額を引き、受け取るユーザーにはその金額を追加する
function tranceferGold(amoumt, fromUsrId, toUserId) {
const fromUser = User.find(id: fromUserId});
fromUser.gold -= amount;
User.save(fromUser);
const toUser = User.find({id: toUserId});
toUser.gold += amount;
User.save(toUser);
}
具体性を除去することで送金するユーザー、受け取るユーザー、金額を変えて利用できるようになった
抽象的なコードとは
コードに柔軟性を持たせる
具体的な判断をコードを使う側に任せる