web-dev-qa-db-ja.com

コンテンツタイプがapplication / x-www-form-urlencodedのHTTP PostリクエストがSpringで機能しない

現在、春に新しいことをしようとしていますHTTP POST request application/x-www-form-url encodedそれと415 Unsupported Media Type ために x-www-form-urlencoded

org.springframework.web.HttpMediaTypeNotSupportedException:コンテンツタイプ 'application/x-www-form-urlencoded'はサポートされていません

誰もそれを解決する方法を知っていますか?コメントしてください。

私のコントローラーの例は次のとおりです。

@RequestMapping(
    value = "/patientdetails",
    method = RequestMethod.POST,
    headers="Accept=application/x-www-form-urlencoded")
public @ResponseBody List<PatientProfileDto> getPatientDetails(
        @RequestBody PatientProfileDto name
) { 
    List<PatientProfileDto> list = new ArrayList<PatientProfileDto>();
    list = service.getPatient(name);
    return list;
}
11
Rajesh

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

次に、以下を試してください:

@RequestMapping(value = "/patientdetails", method = RequestMethod.POST,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public @ResponseBody List<PatientProfileDto> getPatientDetails(
        PatientProfileDto name) {


    List<PatientProfileDto> list = new ArrayList<PatientProfileDto>();
    list = service.getPatient(name);
    return list;
}

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

39
Douglas Ribeiro

@ RequestBody@ RequestParamに置き換え、Javaエンティティを持つパラメーターを受け入れないでください。

コントローラーはおそらく次のようになります。

@RequestMapping(value = "/patientdetails", method = RequestMethod.POST, 
consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public @ResponseBody List<PatientProfileDto> getPatientDetails(
    @RequestParam Map<String, String> name) {
   List<PatientProfileDto> list = new ArrayList<PatientProfileDto>();
   ...
   PatientProfileDto patientProfileDto = mapToPatientProfileDto(mame);
   ...
   list = service.getPatient(patientProfileDto);
   return list;
}
6
Djack

ソリューションはここにあります https://github.com/spring-projects/spring-framework/issues/22734

2つの個別の要求後マッピングを作成できます。例えば。

@PostMapping(path = "/test", consumes = "application/json")
public String test(@RequestBody User user) {
  return user.toString();
}

@PostMapping(path = "/test", consumes = "application/x-www-form-urlencoded")
public String test(User user) {
  return user.toString();
}
3
Chris Valinhas

contentType: "application/x-www-form-urlencoded"を、dataType: "text"に置き換えます。wildfly11は上記のcontenttypeをサポートしていないためです。

0
Virendra khade

最も簡単な方法は、ajaxリクエストのコンテンツタイプを"application/json; charset=utf-8"に設定し、APIメソッドにJSONを消費させることです。このような:

var basicInfo = JSON.stringify({
    firstName: playerProfile.firstName(),
    lastName: playerProfile.lastName(),
    gender: playerProfile.gender(),
    address: playerProfile.address(),
    country: playerProfile.country(),
    bio: playerProfile.bio()
});

$.ajax({
    url: "http://localhost:8080/social/profile/update",
    type: 'POST',
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    data: basicInfo,
    success: function(data) {
        // ...
    }
});


@RequestMapping(
    value = "/profile/update",
    method = RequestMethod.POST,
    produces = MediaType.APPLICATION_JSON_VALUE,
    consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseModel> UpdateUserProfile(
    @RequestBody User usersNewDetails,
    HttpServletRequest request,
    HttpServletResponse response
) {
    // ...
}

問題は、Spring Bootにはajaxリクエスト経由でJSONではないフォームデータを送信する際に問題があることだと思います。

注:ajaxのデフォルトのコンテンツタイプは"application/x-www-form-urlencoded"です。

0

サービスでサポートされている入力コンテンツタイプをSpringに通知する必要があります。これを行うには、リクエストの「Content-Type」ヘッダーに対応する「consumes」アノテーション要素を使用します。

@RequestMapping(value = "/", method = RequestMethod.POST, consumes = {"application/x-www-form-urlencoded"})

コードを投稿すると役立ちます。

0
SpeaksBinary