質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • REST

    137questions

    REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

REST APIにおいて更新のみを行うPUT処理は適切か

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 505

takenyaan

score 111

リソース指向アーキテクチャに基づいてRESTfulなAPIの設定を行なっております。

今回リソースの新規作成は一律POSTによって行う想定です。
(=リソースの一意なIDの払出しはサーバサイドで実施)
この前提のもと、作成したリソースの全体更新を行う場合は、
PUTメソッドを利用すべきでしょうか、それともPATCHメソッドを利用すべきでしょうか。

PUTメソッドを利用する場合

リソースの全体更新を行う場合であればPUTメソッドが適切に思えますが、
IDの払出しはサーバでコントロールしたいため、存在しないIDが指定された場合に新規登録は行いたくありません。
存在しないIDに対してPUTが行われた時に、例えば404(NOT FOUND)等のエラーを返すことは可能ですが、
この対応が冪等性のあるPUT処理として適切ではないような気がします。

PATCHメソッドを利用する場合

更新処理であればPATCHメソッドが利用可能だと考えています。
一方でPATCHは部分更新を行うためのものであり、全体更新処理に利用するのが適切か悩ましいところです。

皆さまの知見、ご意見頂けますと幸いです。

補足:Github APIやQiita APIはPATCHを利用していますね。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

・リクエストにそのリソースの情報を全て乗せて送信する
・更新処理でオートインクリメントや更新日時の自動更新などが発生しない(冪等)

上記であればPUT。

・リクエストにそのリソースの情報を部分的(Nameだけなど)に送信する
・更新処理でオートインクリメントや更新日時の自動更新などが発生する(非冪等)

上記であればPATCHじゃないでしょうか。

 更新のみを行うPUTは適切なのか

以下のサイトから抜粋します。
HTTP Methods [ RESTful APIs Verbs ] – REST API Tutorial

PUTのセクションで

if resource does not exist then API may decide to create a new resource or not

「該当のリソースがなければ、APIは新しいリソースを作るかもしれない(may)
とあるので、別にCREATEしなくてもいいんじゃないでしょうか?

また、このサイトのSummaryのセクションでのPUTの説明では

200 (OK) or 204 (No Content). Use 404 (Not Found), if ID not found or invalid.

「200か204。IDが見つからないか無効な場合は404を使います」
とあるので、やはりCREATEせずに404を返してもいいのかなと思います。

 UPDATE or 404 は冪等ではないのか

これは冪等であると言えるんじゃないでしょうか?
以下は僕の私見なのですが、「冪等」はクライアントに対して同じ結果を返すというものではなく、
サーバー側への影響が同じということじゃないでしょうか。

F5連打やボタン連打をされたとしても、サーバー側への副作用はないということです。
負荷はかかりますけど。

仮にこれが冪等ではないのであれば、冪等メソッドとして定義されているGETやDELETEも
冪等ではないということになります。

1回目にGETできたNAMEが「Foo」だったものが、2回目には「Bar」になっているかもしれませんし、
3回目には404かもしれません。
1回目でDELETEに成功すると、2回目のDELETEは404ですよね。

ただ、いずれの場合も何度実行されようが勝手にデータが書き換わったりはないので
冪等なんだと思います。
だから冒頭で書いた、オートインクリメントや更新日時の自動更新が発生してしまうと
送信した情報以外の情報も変わってしまってしまうので冪等ではないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • REST

    137questions

    REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。