title | emoji | type | topics | published | |||
---|---|---|---|---|---|---|---|
【Oreilly】Web API The Good Parts |
🩹 |
tech |
|
true |
下記の書籍を読みました。 備忘録を書きます。 @card
❌ service
, api
という言葉があり、一見丁寧なURLだけど、文字数が多くて入力しにくい
https://api.example.com/service/api/search/
⭕ 必要最低限の単語で、文字数が少なく入力しやすい
https://api.example.com/search/
❌ sv
, u
という言葉があるが、意味が伝わりにくい
https://api.example.com/sv/u/
⭕ 省略系を使わず、適切に伝える
https://api.example.com/service/users/
❌ 英語: product
, スペイン語: producto
のように勘違いが発生しにくいように英語にする
❌ ローマ字: seihin
は論外
<!-- スペイン語 -->
https://api.example.com/producto/123/
<!-- 日本語 -->
https://api.example.com/seihin/123/
<!-- 英語 -->
https://api.example.com/product/123/
❌ find: あるものを探す
https://api.example.com/find/
⭕ search: ある場所において探す
https://api.example.com/search/
❌ 大文字小文字が混在している
https://api.example.com/User/123
⭕ 小文字のみにする
https://api.example.com/users/123
:::message 改造しやすい(Hackable)とは、 APIのドキュメントを熟読しなくても、構造が想像しやすいという意味 :::
⭕ v1
がversion
を表し、version 1.0
が予想できる
⭕ itmes/123
は、itmes
の中のid
が123
を取得している事が予想できる
⭕ 別のitmes
ならitmes/234
などにしたら取得出来そう
https://api.example.com/v1/itmes/123
❌ 言語がPHPである事が分かる :::message PHPの脆弱性を突いてくる悪い人がいる :::
https://api.example.com/cgi-bin/get-user.php?user=100
⭕ 言語などの情報を開示しない
https://api.example.com/users/123
❌ id
の指定がURL毎でバラバラ
❌ friends
,friend
で複数形と単数形が混在
https://api.example.com/friends?id=100
https://api.example.com/friend/100/message
⭕ friends
の複数形で統一
⭕ id
を使わないで統一
https://api.example.com/friends/100
https://api.example.com/friends/100/messages
メソッド名 | 説明 |
---|---|
GET | リソースの取得 |
POST | リソースの新規登録 |
PUT | 既存リソースの更新 |
DELETE | リソースの削除 |
PATCH | リソースの一部変更 |
HEAD | リソースのメタ情報の取得 |
- PUTメソッド: もともとあるリソースを置き換える
- PATCHメソッド: もともとあるリソースの一部を置き換える
:::message 1MBのような大きなデータの一部のデータを更新したい場合は、PATCHメソッドを使う :::
目的 | メソッド | エンドポイント |
---|---|---|
ユーザー一覧の取得 | GET | https://api.example.com/v1/users/ |
ユーザーの新規登録 | POST | https://api.example.com/v1/users/ |
特定ユーザー情報の取得 | GET | https://api.example.com/v1/users/:id |
ユーザーの情報の更新 | PUT/PATCH | https://api.example.com/v1/users/:id |
ユーザーの情報の削除 | DELETE | https://api.example.com/v1/users/:id |
ユーザーの友達一覧の取得 | GET | https://api.example.com/v1/users/:id/friends |
友達の追加 | POST | https://api.example.com/v1/users/:id/friends |
友達の削除 | DELETE | https://api.example.com/v1/users/:id/friends/:id |
近況の投稿 | POST | https://api.example.com/v1/updates |
近況の編集 | PUT | https://api.example.com/v1/updates/:id |
近況の削除 | DELETE | https://api.example.com/v1/updates/:id |
特定ユーザー近況の取得 | GET | https://api.example.com/v1/users/:id/updates |
友達の近況一覧の取得 | GET | https://api.example.com/v1/users/:id/friends/updates |
:::message
相対位置ではなく、絶対位置を使ってlimit
,offset
をページネーションを行う
:::
❌ 相対位置だと、データ数が増えるとパフォーマンスが下がる ❌ 相対位置だと、データの更新によってデータの順番がズレると取得するデータもズレる
⭕ 絶対位置でid
で検索だと、データ数が増えてもパフォーマンスは下がらない
⭕ 絶対位置でid
で検索だと、データ数が増えても取得するデータはズレない
レスポンスデータに期間を決める。期限が消えたら、再度アクセスをする
現在保持しているキャッシュが最新であるかを確認する。データが更新された場合にのみ取得する
Oreillyを初めて読みました。 自分には難しいと思っていましたが、そこまで難しいと感じなかったです。 Oreillyは学びが多く気に入りました!