9

私は次のような簡単な方法(Tomcat 6.0.35で実行)を持っています:

@RequestMapping(value = "/bla/d", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void d(@RequestParam String d){
    //logic here
}

post likeパラメータ(本文のd = gggg)を使用してDELETEリクエストを送信すると、400BadRequestが発生します。しかし、私がそれをに変更した場合

@RequestMapping(value = "/bla/d", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void d(@RequestParam String d){
    //logic here
}

それは完璧に動作します。Firefoxアドオンを使用してテストしていました(PythonとSpringのRestTemplateも同じ結果になりました)。POSTを使用したリクエストの外観は次のとおりです(aはパラメーターaを使用したaという名前のコピー貼り付けメソッドです)。

POST /bla/a HTTP/1.1
Host: ~~~~:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 7
Pragma: no-cache
Cache-Control: no-cache
a=asdas

HTTP/1.1 204 No Content
Server: Apache-Coyote/1.1
Date: Tue, 12 Jun 2012 09:29:46 GMT

そして、削除は次のようになります。

DELETE /bla/d HTTP/1.1
Host: ~~~~~:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 7
d=asdas

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 971
Date: Tue, 12 Jun 2012 09:30:04 GMT
Connection: close

私を助けてください、私は愚かな何かを見逃しているかもしれませんが、私はそれを見ることができません。私の元々の問題は、DELETEリクエストを使用してpost-like bodyを介して配列を送信することでしたが、より基本的なものが間違っているようです。

4

3 に答える 3

16

いくつかの調査とデバッグを行った後、Spring の ServletWebREquest が org.apache.catalina.connector.RequestFacade.getParameterValues の getParameterValues を呼び出すことがわかりました。これは、次の行を見つけた getParameterValues を呼び出します (Request.java 2599-2600):

if (!getMethod().equalsIgnoreCase("POST"))
return;

これは、RFCがそのような使用法を制限していなくても、Tomcat が積極的にこのユースケースを制限していることを意味する DELETE で POST のようなパラメーターを送信しようとする試みを強制終了します(一部の既存の実装はそのような要求を拒否する可能性があると言っていますが、Tomcat はそのパラメーターをスローするだけです)あちらへ)。Spring と Tomcat を使用し、パラメーターを含む DELETE リクエストを @RequestBody ですべてのリクエスト本文を取得して手動で抽出するなどの醜いソリューションに送信しようとするものをもたらすものは、 Map を認識して何かを削除したいだけの無実のメソッドになりますリクエストボディが含まれています。

@fmucar

于 2012-06-13T14:05:40.103 に答える
0

これはかなり古い投稿ですが、他の誰かが DELETE メソッドで @RequestParam を有効にする方法を探している場合に備えて、Tomcat 8.5.4 で行ったことを次に示します。

@Value("${server.parseBodyMethods}")
private String parseBodyMethods;

@Bean
public TomcatEmbeddedServletContainerFactory containerFactory() {
    return new TomcatEmbeddedServletContainerFactory() {
        protected void customizeConnector(Connector connector) {
            super.customizeConnector(connector);
            connector.setParseBodyMethods(parseBodyMethods);
        }
    };
}

そのカスタマイザに「POST,DELETE」をプラグインすると、削除リクエスト パラメータが機能し始めるはずです。

org.apache.catalina.connector.Connector で parseBodyMethods を見つけました。これに関する Tomcat のドキュメントは次のとおりです。

これは、PUT 要求に対して POST スタイルのセマンティクスをサポートする RESTful アプリケーションで役立ちます。POST 以外の設定では、Tomcat がサーブレット仕様の意図に反する方法で動作することに注意してください。ここでは、HTTP 仕様に従って、HTTP メソッド TRACE は明確に禁止されています。デフォルトは POST (ソース)

于 2016-12-09T22:11:33.830 に答える