LoginSignup
0
0

More than 3 years have passed since last update.

Web API ~the good parts~を読んで

Last updated at Posted at 2018-06-12

Web API ~the good parts~を読んで

91iQh271SHL.jpg

せっかく読んだのでまとめます。
自分が公開するAPIを開発するためだけでなく、サーバーとクライアント側に分れたプロダクトを開発する際にも応用できます。

この本を読んで学べる事

・どのようにwebAPIを開発するべきか
・クライアントとサーバーサイドどこでデータを区切るのか
・openでもclosedでも明確でわかりやすく汎用的なwebAPIを作る事が大事(言うは易し)

2章と3章が対になっている

1章 webAPIとは?

ここはイントロなので割愛

2章 エンドポイントの設計とリクエストの形式

良いエンドポイントとは

  • 短いこと

  • 読んで理解できる
    http://xxxxx.com/api/p0101/c0704/lawyer
    ↑何かの条件で絞り込まれた弁護士がとれそう?
    http://xxxxx.com/api/lawyer/prefecture=1&category=4
    ↑県とカテゴリーの条件で絞り込まれた弁護士が取れると推測できる

  • 大小小文字なし
    ☓ http://xxxxx.com/getLawyer
     文字をつなぐ時はハイフンでつなぐ(googleが推奨)また、ディレクトリを切るとディレクトリを切る必要がなくなる。

  • 改造しやすい
    ☓ https://xxxxx.com/c0500
    ○ https://xxxxx.com/api/cagegory/1
    1の数値を変えたら他のcategoryについての情報がとれそう

  • サーバーのアーキテクチャーが反映されていない
    ☓ xxxx.com/cgi-bin/lawyer/1/pricings
    ↑サーバーのディレクトリ配置が推測できるためセキュリティーリスクにつながる
    ○ xxxx.com/lawyer/1/pricings

件数の取得位置が明確である

サービス名 取得数 相対位置 絶対位置
twiiter count cursor max_id
youtube maxResults pageToken publishBefore

などがあるが

筆者のおすすめは
page/per_pageまたはoffset/limitである。

  • 統一されたルールで開発されている事が大事

memo

urlにsearchを入れる入れない問題
一覧を取得するのか検索結果を返すかによるのでサービスを意識すると良い

自社用のAPIを開発するならば、1ページに複数要素がある場合(トップページなど)パーツごとにAPIを作っていると何度も通信を発生させないといけないケースがあるので1リクエストに複数情報を入れるという手もある。

3章 レスポンスデータの設計

データ形式

海外サービスのほとんどがjson形式だが複数形式をサポートしないといけない場合は urlの後ろに?format=jsonみたいに指定できるようにするとgood

データはフラットにする

{
    id: 1,
    name : 'kousuke tanihata',
    profile :{
        gender : 'male'
    }
}

↑のように不要なネストを避ける

ページネーションをどのように表現するか

{
    profile : 
    {
        id: 1,
        name : 'kousuke tanihata',
    },
    {
        id: 2,
        name : 'j j',
    },
    hasNext : true,
}

エラーがある際はhttp statusを利用する

エラーがあった際はhttp statusをだけでなくにエラーの原因/要因を適切に伝える事が大事

{
    status : 404,
    error_message : 'idが指定されていません',
}
{
    status : 500,
    error_message : 'サーバーの不具合です。',
}

エラーの詳細を伝える

{
    'errors'[
        message : 'bad Auth data',
        url : 'doc.fshuh.com/fagahua',
    ]

}

↑誤ってhtmlを返さないように設計する
API使用者側がエラーを処理する難易度があがる(経験済み)

4章  httpの仕様を利用する

番号代 意味
100 情報
200 成功
300 リダイレクト
400 ユーザー要因のエラー
300 サーバー要因のエラー

詳細↓
https://gist.github.com/rosylilly/3401612

上記のhttpメソッドを利用する事で getLawyerのようなurlを作成しなくすむ

200番台

202 Accepted ファイルアップロード中
204 No Content 削除完了

300番台

API設計では極力使わない
使うならドキュメントに書くようにする

400番台

405 httpメソッドが間違っている
406 フォーマットがエラー
409 Conflict リソースが競合している(指定されたIDやemailがすでに使用されている)
429 レートリミットを超えている

500番台

500 サーバエラー
504 一時的なエラー

リクエストを返す際には必ずメディアタイプを指定する

5章 設定変更をしやすいWeb APIを作る

urlを/v1 とか/v2で分けるのがオススメ(versionの区切りをメディアクエリーにすると冗長になる)
ドキュメントに廃止期間を明示する。

6章 堅牢なwebAPiを作る~安定性と安全性~

安全性

セキュリティー問題について
0,誤った設定で個人情報が公開された状態になっていたケースがある。
1,まずはhttps化しよう
2,xssに気をつける
json を返すならcontent-typeの値がtext/htmlではなく Content-Type: application/jsonに設定する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0