web-dev-qa-db-ja.com

GETメソッドを使用したファイルのアップロード

ご存知のように、ファイルのアップロードはほとんどの場合POSTメソッドを使用して行われます。それでは、代わりにGETメソッドをファイルのアップロードに使用できないのはなぜですか? HTTP GETアップロードに対する特定の禁止事項はありますか?

31
Pradip Kharbuja

GETリクエストにはエンティティボディが含まれる場合があります

RFC 2616は、GET要求の一部としてエンティティ本体を妨げません。 PHP=poorly-named_$_GET_ superglobal。_$_GET_は技術的にはHTTP GETリクエストメソッドとは何の関係もありません-これはリクエストURIクエリ文字列からのURLエンコードされたパラメーターのキーと値のリストにすぎません。_$_GET_要求がPOST/PUT/etcを介して行われた場合でも配列奇妙な、正しい抽象化ではありませんか?

GETエンティティ本体が悪い考えである理由

仕様はGETメソッドについて述べている ...何をしますか:

特に、GETメソッドとHEADメソッドは、検索以外のアクションを実行する意味を持つべきではないという慣習が確立されています。これらのメソッドは「安全」と見なされるべきです。

GETで重要なことは、GETリクエストが安全であることを確認することです。それでも、禁止は "SHOULD NOT"のみです...技術的には、HTTPは依然としてGETリクエストが厳密に基づいていないアクションをもたらすことを許可します"検索。"

もちろん、GETという名前のメソッドを使用してリソースを「取得」する以外のアクションを実行するセマンティックの観点からも、あまり意味がありません。

GETエンティティボディが完全に間違っている場合

べき等性に関して、仕様には次のように書かれています:

メソッドは、「エラーまたは有効期限の問題を除いて」N> 0の同一リクエストの副作用が単一リクエストの場合と同じであるという点で「べき等性」のプロパティを持つこともできます。メソッドGET、HEAD、PUT、およびDELETEは、このプロパティを共有します。

これは、GETメソッドが同じリソースに対する複数のリクエストに対して異なる副作用を持たないことを意味します。そのため、GET要求の一部として存在するエンティティ本体に関係なく、副作用は常に同じでなければなりません。素人の言葉で言えば、これは、エンティティ本体で100回GETを送信した場合、サーバーは100個の新しいリソースを作成できないことを意味します。リクエストを1回送信する場合でも100回送信する場合でも、同じ結果が必要です。これは、エンティティ本体を送信するためのGETメソッドの有用性を厳しく制限します。

疑わしい場合は、メソッドの有効性とその結果生じる副作用を評価する際に、常に安全性/べき等性テストにフォールバックします。

36
rdlowrey