9

フレームワーク 3.2.3.RELEASE を使用して spring mvc アプリを開発しています

私のアプリでは、Multipart を StandardServletMultipartResolver で処理しますが、Apache commons-fileupload 1.3 でも同じです。

isMultipart メソッドの実装で PUT メソッドではなく POST メソッドのみが考慮される理由を知りたいです。エンティティと関連ファイルを更新したい場合は、POST で行う必要があります。

org.springframework.web.multipart.support.Standard ServletMultipartResolver を見る:

public boolean isMultipart(HttpServletRequest request) {
    // Same check as in Commons FileUpload...
    if (!"post".equals(request.getMethod().toLowerCase()) ) {
        return false;
    }
    String contentType = request.getContentType();
    return (contentType != null && contentType.toLowerCase().startsWith("multipart/"));
}

org.apache.commons.fileupload.servlet.ServletFileU pload にいる間:

public static final boolean isMultipartContent(HttpServletRequest request) {
    if (!POST_METHOD.equalsIgnoreCase(request.getMethod() )) {
        return false;
    }
    return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}

実際、PUTの代わりにPOSTメソッドを使用するだけです..しかし、PUTが考慮されない理由を理解したいです!

返信ありがとうマルコ

4

2 に答える 2

15

RFCは言った

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

POST 要求の URI は、含まれるエンティティを処理するリソースを識別します。そのリソースは、データを受け入れるプロセス、他のプロトコルへのゲートウェイ、または注釈を受け入れる別のエンティティである可能性があります。対照的に、PUT リクエストの URI は、リクエストに含まれるエンティティを識別します。ユーザー エージェントは、意図されている URI を認識しており、サーバーはリクエストを他のリソースに適用しようとしてはなりません。

したがって、PUT リクエストは単一のリソースを表します。
ただし、マルチパートとは、1 つのボディに複数のリソースがあることを意味します。

http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html

1 つまたは複数の異なるデータ セットが 1 つの本文に結合されている複数の部分からなるメッセージの場合、「複合」Content-Type フィールドがエンティティのヘッダーに表示される必要があります。次に、ボディには 1 つ以上の「ボディ パーツ」が含まれている必要があります。それぞれの前にカプセル化境界があり、最後の部分には終了境界が続きます。

したがって、PUT リクエストのセマンティックはマルチパート データと一致しません。そして、POST リクエストのリクエスト URI が「囲まれたエンティティのハンドラ」であるため、POST が一致します。

于 2013-12-04T23:58:52.133 に答える