実務でつまずく

REST API

2019/10/24

自己紹介

2

@non_z250

non’s Labo ( https://labo.nozomi.bike/ )

PHP / Laravel / CakePHP / Vue / Nuxt / C#

Bike: Z250

自己紹介

3

普段は……?

今年の抱負メーカー

(個人開発)

(https://ambition.nozomi.bike/)

トドTask

(個人開発)

(https://todo.nozomi.bike/)

スマレジ本部機能開発

サーバーサイド担当

REST API

4

実践的なREST API

REST API

5

よくあるやつ

products

[ GET ] api/products (参照)

[ POST ] api/products (登録)

[ PUT ] api/products/{:id} (更新)

[ GET ] api/products/{:id} (参照)

[ DELETE ] api/products/{:id} (削除)

[ GET ] api/products/{:id},{:id},{:id}(参照)

REST API

6

マスターデータならとても簡単😊

REST API

7

実際には・・・

REST API

8

YYY

XXX

ZZZ

🤔

このあたりを一括で

登録したいんやけどなぁ

REST API

9

多機能になるにつれ発生する

REST API

10

自作アプリでもあった

REST API

11

tasks

notes

tasks_notes

tasks - タスク

notes - ノート

tasks_notes - 中間テーブル

REST API

12

tasks

notes

tasks_notes

api/tasks_notes

でリソースにアクセス???

🤔

REST API

13

解決策①

テーブル=リソースではない

todo

REST API

14

tasks

notes

tasks_notes

[ POST ] api/todo

{

“task”: “新しいアプリを作る”,

“note”: “LINE Bot を使いたい”,

“status”: “1”

}

👍

REST API

15

解決策②

煩わしいAPIにしない

tasks

notes

tasks_notes

[ POST ] api/tasksのResponse

{

“message”: “タスクの登録に成功。”

}

🤔

16

REST API

[ POST ] api/notesのResponse

{

“id”: “1”,

“note”: “LINE Bot を使いたい”,

“status”: “1”

}

17

REST API

tasks

notes

tasks_notes

😯

[ POST ] api/notesのResponse

{

“id”: “1”,

“note”: “LINE Bot を使いたい”,

“status”: “1”

}

[ POST ] api/tasks

{

“id”: “1”,

“task”: “新しいアプリを作る”,

“status”: “1”,

“note_id”: “1”

}

18

REST API

tasks

notes

tasks_notes

👍

REST API

19

解決策①のほうがスマートでいい

REST API

20

アイスブレイク

REST API

21

図書館API

https://calil.jp/doc/api.html

ISBNが元になっている。

専用データベースや、jsライブラリも提供している。

https://www.ndl.go.jp/jp/use/api/index.html

国立国会図書館の公式サービス。

加盟する全国の図書館から情報を取得できる。

http://crd.ndl.go.jp/reference/

国立国会図書館に関連する組織のAPI。

カーリル

国立図書館API

レファレンス協同

データベース

REST API

22

APIが当たり前になりつつある

そうなればこういう事件は起こらない

REST API

23

🤔

サービスを起動したいんやけど、リソースちゃうしなぁ

検索サービス

REST API

24

解決策

RESTにこだわりすぎない

REST API

25

🤔

検索サービス

[ GET ] api/search

{

“users”: {

“name”: “Z250”,

},

“tasks”: {

“task”: “Z250”

},

“notes”: {

“note”: “Z250”

}

}

REST API

26

👍

検索サービス

[ GET ] api/search?q=Z250

[ POST ] api/search

[ PUT ] api/search

[ DELETE ] api/search

は無い

REST API

27

RESTにこだわりすぎない

使用者にわかりやすいように

REST API

28

エラー処理

REST API

29

🤔

エラーレスポンス

{

“error_code”: “404”,

“error_message”: “このIDは存在しません”

}

REST API

30

HTTP ステータスコードを使う

当たり前だけど、中々できない

200 OK - GET, PUT, PATCH, DELETE リクエストが成功した場合に応答。もしくは、POST リクエストが結果的に何もリソースを作らなかった場合に応答。

201 Created - POST リクエストがリソース作成に成功した場合に応答。なお、そのリソースへのリンクを Location ヘッダに含める必要がある。

204 No Content - 成功したDELETE リクエストで、ボディを返したくない場合に応答

301 Moved Permanently - 恒久的移動

304 Not Modified - HTTP キャッシュが有効な場合に応答

400 Bad Request - パース不可能なリクエストボディが来た場合に応答

401 Unauthorized - 認証がされていない、もしくは不正なトークンの場合に応答

403 Forbidden - 認証はされているが、認可されていないリソースへのリクエストに応答

404 Not Found - 存在しないリソースへのリクエストに応答

405 Method Not Allowed - 認可されていないメソッドでのリクエストに応答

410 Gone - 今は存在しないリソース(廃止されたAPIなど)で空要素を返す場合などに応答

415 Unsupported Media Type - 対応していない MediaType が指定された場合に応答

422 Unprocessable Entity - バリデーションエラーに対して応答

429 Too Many Requests - 回数制限をオーバーしたリクエストに対して応答

REST API

31

REST API

32

👍

エラーレスポンス

[ GET ] api/users/99999999

HTTP_STATUS_CODE: 404

{

“message”: “このIDは存在しません”

}

最後に

33

  • フロント言語の台頭でAPIは更に重要に
  • 機械学習・統計のネタにされやすくなる
    • 食べログ
    • 天気予報
    • 図書館
  • リソースではなくサービスの提供もできる

実務でつまずく

REST API

Fin

Smaregi Tech Talk #1 REST API - Google Slides