2017-08-22 3 views
1

これは一般的な設計上の質問ですが、このような状況ではどのような責任がありますか?レコードがすでに存在するかどうかを確認し、Updateを呼び出すのは呼び出し元の責任ですか?あるいは、その決定を下すことはAPIの責任であるべきですか?APIでのCreateOrUpdateの責任

第1のシナリオでは、呼び出し元にビジネスロジックが負担されていますが、2番目のシナリオではロジックがAPIを汚染し、ハイブリッド動作を作成して懸念の原則に違反します。

答えて

0

CreateOrUpdateエンドポイントを実装すると、いくつかのREST原則が破られますが、アプリケーション開発者にとっては便利なことがあります。あなたは、リソース指向のAPIの観点からではなく、遠隔の関数呼び出しについて考えています。

これを考慮してください:API URLはリソースを識別します。

URLがコレクション(つまり/ customers /)を指している場合、作成アクション(通常はPOSTメソッドにマップされます)は確かに意味があります。複数のリソースへの更新を許可する場合は、「更新」機能が有効です。 POSTは、新しく作成されたリソース(すなわち、/ customers/1)にコード201および識別子を戻す必要があります。すでに存在するリソースのために作成が失敗した場合は、コード409を返す必要があります。データ検証のような他の制約が満たされていない場合は400です。

URLが既存のリソース(つまり/ customers/id/1)を指している場合、作成アクションは意味をなさないので、コード400になります。通常、更新はPUTメソッド(またはsometiemes PATCH、if部分的なリソースの更新)、一般的に更新が成功した場合は200、失敗した場合は4xxを返します。

POST要求を受け取る/ CreateOrUpdateエンドポイントを作成する場合は、その動作と戻り値が状況によって異なるため、独自のプロトコルを設計する必要があります。 PUT @Evert

を作成するために使用することができますが、あなたは、クライアントが必要な場合にのみ

PUT /users/myusername 

の問題、つまり識別子でエンドポイントURIを策定することとされている:

  1. クライアントが発見しなければなりません利用可能なもの、
  2. 自然な識別子が使用されている場合は、実装に応じて問題が発生する可能性がある自然な理由が存在する可能性があります。

私が作成している主なポイントは、アクション(関数)を表すREST APIエンドポイントの作成を避けることです。 HTTPメソッドを使用して、永続化されたリソースに対してそれぞれのアクションを実行します。

+0

明らかに、APIにCreateOrUpdateエンドポイントを配置しません。 – LastTribunal

+0

このREST回答は「一般的な設計の質問」に適用されるのはなぜですか? – weston

+3

私は、作成または更新がRESTに反対すると申します。 https://stackoverflow.com/questions/630453/put-vs-post-in-restこれはPUTのためのものです。 – weston

関連する問題