現在、春に新しいことをしようとしています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;
}
問題は、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
@ 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;
}
ソリューションはここにあります 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();
}
contentType: "application/x-www-form-urlencoded"を、dataType: "text"に置き換えます。wildfly11は上記のcontenttypeをサポートしていないためです。
最も簡単な方法は、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"
です。
サービスでサポートされている入力コンテンツタイプをSpringに通知する必要があります。これを行うには、リクエストの「Content-Type」ヘッダーに対応する「consumes」アノテーション要素を使用します。
@RequestMapping(value = "/", method = RequestMethod.POST, consumes = {"application/x-www-form-urlencoded"})
コードを投稿すると役立ちます。