web-dev-qa-db-ja.com

GETとPOST-それは悪い習慣ですか?

GETとPOSTを混在させるのは悪い習慣ですか? (これはPHPであることに注意してください)

例えば.

<form action="delete.php?l=en&r=homepage" method="post">
 <!-- post fields here -->
</form>
29
mauris

実際には、これによりPOSTリクエストリクエストがサーバーに送信されるため、技術的には2つを混在させることはありません。URLパラメータでPOSTを使用しています。非表示フィールドとしての形式である必要があるパラメーターにURLを使用しない限り、これには根本的な問題はありません。

簡単なルールがあります。サーバーを変更しない定数にはGET(おそらくURLパラメーターを使用)を使用し、サーバーを変更するものにはPOST)を使用します。URLパラメーターに次のIDが含まれている場合削除したいものがある場合、それは悪い習慣になります。

編集、数年後

ソースを求められたので、ここにHTTPの仕様そのものの関連部分があります

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

[〜#〜] get [〜#〜]およびHEADメソッドはすべきではない)という規則が確立されています検索以外のアクションを実行することの重要性があります。これらのメソッドは「安全」と見なす必要があります。これにより、ユーザーエージェントは次のような他のメソッドを表すことができます。 [〜#〜] post [〜#〜]、PUTとDELETE、特別な方法で、安全でない可能性のあるアクションが要求されているという事実をユーザーに認識させます。

GETは何も変更しないでください、POSTはサーバーを変更するためのものです(安全でない操作)。GETは何度でも呼び出すことができるはずです。べき等以上のものです: (可能な限り)副作用がないはずです!GETを使用すると、キャッシュが含まれている場合、リクエストがサーバーに到達しない場合があります

そうそう:あなたはフォームを持っています、あなたがGETまたはPOSTを使用するかどうか知りたいですか?次に、サーバーを変更=> POST、サーバーを変更しない=> GET。 また、URLには任意の動詞(getまたはpost)でアクセスできるため、サーバーを変更するデータをURLに入れないでください。誰かがそのURLをコピーし、GETを実行して、知らないうちにサーバー。誰かがFacebookでそのURLをコピーし、10000人がランダムなものを削除し始めたらどうなるか想像してみてください。良くない。最近のフレームワーク(ノード、Ruby)はそれに対してよりよく絶縁されていますが、基本的なPHPではないため、その言語の経験則としては適切です。

45

それはまだPOSTであり、URLにクエリ文字列を含めるだけです。これには問題はありません。これは、非表示の入力フィールドを使用して投稿データにこれらの変数を含めるよりもおそらくクリーンです。さらに、サーバーでは、投稿データにl(言語?)の値を含めたくない場合があります。常にクエリ文字列に含まれている場合は、POSTリクエストの特別な場合ではなく、他の場所で同じコードを使用して言語を決定できます。

5
Joel

いいえ、これで問題ありません。これは、会社のWebサイト、たとえばユーザー管理ページで正確に行います。通常のURLは次のとおりです。

/admin/user?name=jkugelman

次に、ユーザーを削除するには、この同じページに投稿します。ただし、削除はステートフルアクションであり、POSTを使用して実行する必要があるため、GETを実行する代わりに変数をPOST)します。この:

<!-- Post back to self -->
<form action="/admin/user?name=jkugelman">
    <input type="submit" name="delete" value="Delete"
           onchange="return confirm('Are you sure?')" />
</form>
5
John Kugelman