web-dev-qa-db-ja.com

コンテンツタイプ 'application / x-www-form-urlencoded; charset = UTF-8'は@RequestBody MultiValueMapではサポートされていません

答えに基づく Spring @Controllerでx-www-form-urlencodeされた問題に関する

以下の@Controllerメソッドを書きました

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
            , produces = {"application/json", "application/xml"}
            ,  consumes = {"application/x-www-form-urlencoded"}
    )
     public
        @ResponseBody
        Representation authenticate(@PathVariable("email") String anEmailAddress,
                                    @RequestBody MultiValueMap paramMap)
                throws Exception {


            if(paramMap == null || paramMap.get("password") == null) {
                throw new IllegalArgumentException("Password not provided");
            }
    }

以下のエラーで失敗したリクエスト

{
  "timestamp": 1447911866786,
  "status": 415,
  "error": "Unsupported Media Type",
  "exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path": "/users/usermail%40gmail.com/authenticate"
}

[PS:Jerseyははるかに親しみやすいが、ここでは実用上の制限があるため使用できなかった]

59

問題は、application/x-www-form-urlencodedを使用すると、SpringがそれをRequestBodyとして認識しないことです。したがって、これを使用したい場合は、@ RequestBodyアノテーションを削除する必要があります。

その後、次のことを試してください。

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
        produces = {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody  Representation authenticate(@PathVariable("email") String anEmailAddress, MultiValueMap paramMap) throws Exception {
   if(paramMap == null && paramMap.get("password") == null) {
        throw new IllegalArgumentException("Password not provided");
    }
    return null;
}

注釈を削除したことに注意してください@ RequestBody

答えコンテンツタイプapplication/x-www-form-urlencodedのHTTP PostリクエストはSpringでは動作しません

70
Douglas Ribeiro

メソッドパラメータを@RequestParamでマークすることができるようになりました、そしてそれはあなたのために仕事をするでしょう。

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
  //work with Map
}
47
Scadge

リクエストにヘッダーを追加してコンテンツタイプをapplication/jsonに設定します。

curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY

このようにして春はコンテンツを解析する方法を知っています。

10
Agustin Almonte

私は このStackOverflowの答え で代替案について書きました。

そこに私は段階的に書いて、コードで説明しました。簡単な方法:

最初:オブジェクトを書く

2番目:AbstractHttpMessageConverterを拡張したモデルをマッピングするためのコンバーターを作成する

3番目の:configureMessageConvertersメソッドをオーバーライドするWebMvcConfigurer.classを実装したこのコンバーターを春に使うように伝えます

4番目および最後:コントローラ内のマッピングでこの実装設定を使用すると、オブジェクトの前に= MediaType.APPLICATION_FORM_URLENCODED_VALUEと@RequestBodyが消費されます。

私はスプリングブーツ2を使用しています。

1
Marco Blos

Mapを使う代わりに、パラメータを直接使うことができます。

   @RequestMapping(method = RequestMethod.POST, value = "/event/register")
   @ResponseStatus(value = HttpStatus.OK)
   public void registerUser(@RequestParam(name = EVENT_ID) String eventId,
                            @RequestParam(name = ATTENDEE_ID) String attendeeId,
                            @RequestParam(name = SCENARIO) String scenario) {
    log.info("Register user: eventid: {}, attendeeid: {}, scenario: {} ", eventId,attendeeId,scenario);

    //more code here
}
0
Crenguta S

春5

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam MultiValueMap body ) {

    // import org.springframework.util.MultiValueMap;

    String datax = (String) body .getFirst("datax");
}
0
Edgardo Genini