答えに基づく 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ははるかに親しみやすいが、ここでは実用上の制限があるため使用できなかった]
問題は、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では動作しません
メソッドパラメータを@RequestParam
でマークすることができるようになりました、そしてそれはあなたのために仕事をするでしょう。
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
//work with Map
}
リクエストにヘッダーを追加してコンテンツタイプをapplication/jsonに設定します。
curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY
このようにして春はコンテンツを解析する方法を知っています。
私は このStackOverflowの答え で代替案について書きました。
そこに私は段階的に書いて、コードで説明しました。簡単な方法:
最初:オブジェクトを書く
2番目:AbstractHttpMessageConverterを拡張したモデルをマッピングするためのコンバーターを作成する
3番目の:configureMessageConvertersメソッドをオーバーライドするWebMvcConfigurer.classを実装したこのコンバーターを春に使うように伝えます
4番目および最後:コントローラ内のマッピングでこの実装設定を使用すると、オブジェクトの前に= MediaType.APPLICATION_FORM_URLENCODED_VALUEと@RequestBodyが消費されます。
私はスプリングブーツ2を使用しています。
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
}
春5
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam MultiValueMap body ) {
// import org.springframework.util.MultiValueMap;
String datax = (String) body .getFirst("datax");
}