0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

REST APIにおけるクエリパラメタとパスの使い分け

Posted at

APIのURLとして以下のどちらが適切か

判断基準について

以下2点をもとにどちらで表現するか判断すると良い。

  1. 一意なリソースを表すのに必要かどうか
    ⇛パスパラメータを利用

  2. 省略可能かどうか
    ⇛クエリパラメタを利用

ユースケース

GET

GET https://api.hoge.com/users?id=12345
GET https://api.hoge.com/users/12345

この場合、ユーザIDは省略可能(全ユーザを取得可能)なので、クエリパラメタでの表現が適切。
○ GET https://api.hoge.com/users?id=12345     

POST

POST https://api.hoge.com/users?id=12345
POST https://api.hoge.com/users/12345
POST https://api.hoge.com/users(bodyで指定)

この場合、ユーザIDを省略することは出来ないので、パスでの指定か、bodyでの指定が適切。
厳密には、POST時にusersという集合の中にユーザ12345はまだ存在しておらず指定出来ないので、

POST https://api.hoge.com/users(bodyで指定)

がbetterか。

PUT

PUT https://api.hoge.com/users?id=12345
PUT https://api.hoge.com/users/12345
PUT https://api.hoge.com/users(bodyで指定)

この場合、ユーザIDを省略することは出来ないので、パスでの指定か、bodyでの指定が適切。
/usersという指定だと、users全体の集合をbodyに入れて集合全体更新するようなイメージもあるので、
明確に1ユーザ更新のAPIの場合、

PUT https://api.hoge.com/users/12345

がbetterか。

まとめ

一般論でのbetterはこんな感じになるが、
一方で、更新系に関しては要件に依るところも大きく、APIごとに設計が分かれるところ。

GET https://api.hoge.com/users?id=12345
POST https://api.hoge.com/users(bodyで指定)
PUT https://api.hoge.com/users/12345

たとえば、複数ユーザの一括登録、一括更新をしたい場合に、
パス指定だと対応出来ないため、以下のような設計にしたとする。

GET https://api.hoge.com/users?id=12345
POST https://api.hoge.com/users(bodyで指定)・・・Nユーザ対応可能(N≧1)
PUT https://api.hoge.com/users/12345 ・・・1ユーザ対応可能
PUT https://api.hoge.com/users(bodyで指定) ・・・Nユーザ対応可能(N≧1)

そうすると下から二つ目は冗長なので、それなら最初から以下のように設計した方が良い。

GET https://api.hoge.com/users?id=12345
POST https://api.hoge.com/users(bodyで指定)・・・Nユーザ対応可能(N≧1)
PUT https://api.hoge.com/users(bodyで指定) ・・・Nユーザ対応可能(N≧1)

そのため、原則を踏まえて、API全体設計の整合やリクエスト要件を踏まえた上で、
それぞれ設計するのが良い。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?