LoginSignup
harmless_3d6
@harmless_3d6 (兎角 鹿角)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

REST APIの絞り込みの考え方で悩んでます

既存のLaravelで簡単なAPIを作ってます。

仮でEntryというモデルがあるとして、

Route::get('entry/{entry}', function (Entry $entry) {
    return $entry;
});

で情報を取得できるようにしてます。
(urlにするとhttp://〇〇/api/entry/{entry_id})

ここから発展させて、取得したい50件程度のデータのidを指定することで
全件の中から絞り込み処理・返却が行われるようにしたいです。


作る際にREST APIの記事を見つけ、規約を当てはめられないか考えていたのですが、
先の「全件の中から絞り込んで取得」という目的を、どう実現したら良いか
わからなくなってしまいました。

いくつか参考記事や同様の質問にも目を通したのですが、

  • 制約上、「/api/entries/filter/{entry_id}-{entry_id}-{entry_id}」のようにしてgetすべき
  • 検索結果というデータを「作る」から、絞り込み条件をpostして良い
  • post→処理→返却(get)だから、post処理でも実質get。制約には引っかからない
  • 「複雑な条件」は、そもそも設計が悪い
  • そもそも規約に合わせる必要がない。泥沼だから。

などなど。色んな意見があって迷います。


もしこれらについて知見あれば教えていただきたいです。

  1. get派、post派
  2. 考え方

よろしくお願いします。

0

1Answer

まず私の結論ですが。

GET /entries

そして、パラメータとしてidsを指定するようにします。(配列、もしくはカンマ区切り)

※/apiについては省きます。ドメインで表現できる場合は冗長、などこれはこれで色々あるので。

他の機能もまとめて書けばイメージしやすいでしょうか。

機能 メソッド エンドポイント
一覧取得 GET /entries
新規登録 POST /entries
特定の情報取得 GET /entries/:id
更新 PUT/PATCH /entries/:id
削除 DELET /entries/:id

LaravelのリソースコントローラでもこのようなURL設計になったと思います。

get派、post派

GETです。
POSTメソッドは新しい情報を登録するために利用します。
GETメソッドは情報取得を表すので、データの取得を目的とするならGETにします。

考え方

必ずしも「これでなければいけない」というものはないと思いますが、
一貫した考えがないとAPIを作るにも使うにも困ると思います。

私はこちらの書籍を参考にしています。
Web API: The Good Parts

質問されていることについても色々と解説されているので、読んでみてはいかがでしょうか?

2Like

Comments

  1. @harmless_3d6

    Questioner
    回答ありがとうございます。
    真っ先に挙がるのは断然getなんですね……。

    挙げていただいた配列やカンマ区切り、
    あと検索してみたらURLのクエリ配列に条件式埋め込む方法まで……
    安易に「データが多いからpostしたら良い」ってことじゃ全然無いんですね。
    いろいろ知らない世界でした(笑)

    書籍の紹介もありがとうございます。
    こちらも知りませんでした。
    あとからチェックさせていただきます!

Your answer might help someone💌