2009-08-22 4 views
2

agaviフレームワークは、情報の更新にPUTリクエストを使用してPOSTを作成します。通常、RESTでは、これは逆の方法で使用されます(データレコード全体を置き換えるPUTの間に情報を追加するPOSTを指すことがよくあります)。php mvc framework agaviはRESTに準拠したCRUDを使用しますか?

私が正しく理解していれば、重要な問題はPUTが冪等でなければならないということですが、POSTにはこの要件はありません。したがって、私は新しいレコードの作成が偶然になる可能性がある(つまり、複数の要求がレコードの複数の作成につながることはない)、特にORMがidを主キーとして使用し、新しいレコードのidがわからない(データベース内で自動作成されているため)クライアントに送信されるため、要求の一部になることはできません。どのようにしてPUTリクエストのためにこれを考慮して、アガビは冪等級の要求をどのように維持しますか?

ありがとうございました。

答えて

5

PUTは、完全なレコードの作成と更新の両方に使用できます。 POSTは通常、リソースのURLを指定せずに、サーバー上で新しいタイプのレコードを作成するだけでなく、部分的な更新や関連する操作にも使用されます(POSTの/ articles/23/commentsは201状態とLocation:/ articlesを返します)。/23/comments/283136ヘッダー)。だからあなたの場合(シーケンス/自動インクリメントID付き)、あなたはそのアプローチを使用します。

ただし、HTML(したがってWebフォーム)は異なります。それはGETとPOSTを知っているだけで、DELETEとPUTはありません。削除操作および更新操作では、POSTメソッドがオーバーロードされます。

これはAgaviがデフォルトでPOSTを「書き込み」にマップし、GETを「読み取り」にマップする理由です。これは最も一般的な使用例です。比較的「中立」であるため「読み込み」と「書き込み」が選択されました。 GETとPOSTの安全性の側面を表現します(「GETは副作用なしで呼び出すことができます」など)。

factories.xmlでAgaviWebRequest実装の動詞のマッピングを変更できます。助けが必要な場合はAgaviのユーザーメーリングリストまたはIRCチャンネルを参照してください(またはここで質問してください)。 IRCチャンネルの多くの人は、APIをきれいにするための助けが必要な場合に備えて、URLスキーム設計にもかなり経験があります。

+0

あなたの答えをありがとう。はい、私はfactories.xmlファイルでそれを変更する方法のいくつかの指示を見ました。私はレールとアガビがなぜ彼らのアプローチで異なるのかを知りたいと思っていました。あなたの答えは私にこの質問の新しい視点を与えてくれたと思います。 – txwikinger

+0

明確にするには、HTML5の作業草案が他のHTTP動詞をWebフォームに追加するので、 "HTML 4.01"を指定する必要があります。 – aehlke

0

PUTを使用してリソースを作成することができますが、リソースがすでに存在する場合(または以前のPUTによって既に作成されている場合)は、リソースを更新するだけです。ただし、単純なCRUDの場合、POSTはリソースを更新すべきではありません。 HTTP動詞には、CRUDだけでなく、多くの場合に便利なので、特定のアクションへのマッピングが定義されていないことに注意してください。

また、この質問はRESTとは関係がないことに注意してください。適切なHTTPの使用です。そのため、RESTタグを削除してください。

+1

ありがとうございます。私の質問は、agaviが適切にRESTを使用しているかどうかを確認することでした。 – txwikinger

+0

とにかく、私はRESTタグを削除するために再タグ付けしました。あなたは誤ったRESTの解釈をしていると思います。ここで本当に意味するのは、「agaviがHTTPを適切に使用しているかどうか」です。 – aehlke

2

PUTを作成して考えるのではなく、それを「パッティング」と考えてください。リソースをURIに配置します(つまり、リソース全体をURIに送信します)。

PUT http://example.com/articles/1 

あなたが同じ結果を取得し、あなたはそのURIでリソースを変更していない(同じURIに同じリソース全体を送って)これを繰り返すと、それはそれは冪等にするものです。

PUTのagaviの実装が冪等である場合、それは正しくPUTを実装しています。それ以外の場合はそうではありません。

+0

あなたの答えをありがとう。アガビのPUTが冪等体であるかどうかという疑問は、私が把握しようとしているものです。 – txwikinger

0

私はこれまでにこの問題を抱えていました。これは次のように解決できますchanging the factories.xml

+0

あなたの答えをありがとう。私はfactories.xml設定について知っています。私は原則に興味がありました。異なるフレームワークがそれをどうやって行うように見えるので、それが正しく行われるべきかどうかです。 – txwikinger

関連する問題