2012-06-12 9 views
8

6.0.35そうのように見えます(Tomcatの6.0.35上で実行されています) (d = gggg)、私は400のバッドリクエストを得る。 もし私がそれを変更すればSpring MVCのは、私は簡単な方法を持っている

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

それは完全に動作します。 は、私はFirefoxのアドオン(同じ結果とし、PythonとSpringのRestTemplate)、それをテストするために使用していた、ここで(aはパラメータaと名付け対処貼り付けた方法である)POSTでどのようにリクエストの外観です:

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リクエストを使ってポストライクボディを介して配列を送信していましたが、より基本的なものが間違っているようです。

答えて

13

私は、SpringのServletWebREquestが次の行を見つけたgetParameterValuesを呼び出すorg.apache.catalina.connector.RequestFacade.getParameterValuesのgetParameterValuesを呼び出すことを発見しました(Request.java 2599 -2600):

Tomcatが活発であることを意味DELETEとPOSTのようなパラメータを送信しようとする試みを殺す
if (!getMethod().equalsIgnoreCase("POST")) 
return; 

は、このユースケースを制限していてもRFC does not restrict such usage(それはいくつかの既存の実装では、拒否することができると言うんが要求、Tomcatはそれを離れてパラメータを投げる)。 SpringとTomcatを使用していて、@RequestBodyですべてのリクエスト本体を取得し、手作業で抽出するような醜い解決策にパラメータを指定してDELETEリクエストを送信しようとすると、何らかの問題を意識して削除する必要があるリクエスト本文を含むマップ。

0

@fmucar私は同様の問題を持っていたし、私が見つけた解決は、クエリ文字列にフィールドを追加することでした。私はまだフォーム本体がこのように除外される理由を知りたいが、今のところこれは回避策である。

あなたの例では、~~~~~:8080 URLに ?a = asdas をホストに追加することを意味します。

私はspring-webmvc:3.2.4.RELEASEを使用していますので、これがあなたのバージョンで動作するかどうかは分かりません。

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のparseBodyMethodsが見つかりました。これは、Tomcatのドキュメントです。

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

です。
関連する問題