복붙노트

[SPRING] 콘텐츠 유형 application / x-www-form-urlencoded가 Spring에서 작동하지 않는 Http Post 요청

SPRING

콘텐츠 유형 application / x-www-form-urlencoded가 Spring에서 작동하지 않는 Http Post 요청

현재 봄에 새로 온 것은 HTTP POST 요청 응용 프로그램 / x-www-form-url을 인코딩하려고하지만 헤더를 유지하면 스프링이 그것을 인식하지 못하고 415 지원되지 않는 미디어 유형 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;
}

해결법

  1. ==============================

    1.문제는 application / x-www-form-urlencoded를 사용할 때 Spring이이를 RequestBody로 이해하지 못한다는 것입니다. 그래서 우리가 이것을 사용하려면 우리는 @RequestBody 주석을 제거해야합니다.

    문제는 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 주석을 제거했습니다.

  2. ==============================

    2.Spring이 사용자의 서비스에서 지원하는 입력 내용 유형을 알려줘야합니다. 요청의 "Content-Type"헤더에 해당하는 Annotation Element를 "소비"하면이 작업을 수행 할 수 있습니다.

    Spring이 사용자의 서비스에서 지원하는 입력 내용 유형을 알려줘야합니다. 요청의 "Content-Type"헤더에 해당하는 Annotation Element를 "소비"하면이 작업을 수행 할 수 있습니다.

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

    코드를 게시하면 도움이 될 것입니다.

  3. ==============================

    3.가장 쉬운 방법은 아약스 요청의 콘텐츠 유형을 "application / json; charset = utf-8"로 설정 한 다음 api 메소드가 json을 소비하도록하는 것입니다. 이처럼

    가장 쉬운 방법은 아약스 요청의 콘텐츠 유형을 "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){
    

    문제는 스프링 부트가 아약스 요청을 통해 json이 아닌 폼 데이터를 제출하는 데 문제가 있다고 생각합니다. 참고 : 아약스의 기본 콘텐츠 유형은 "application / x-www-form-urlencoded"입니다.

  4. ==============================

    4.@RequestBody를 @RequestParam으로 대체하고 java 엔터티가있는 매개 변수를 허용하지 않아야합니다.

    @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;
    }
    
  5. from https://stackoverflow.com/questions/34782025/http-post-request-with-content-type-application-x-www-form-urlencoded-not-workin by cc-by-sa and MIT license