@RequestBody MultiValueMap에 대해 콘텐츠 유형 'application / x-www-form-urlencoded; charset = UTF-8'이 지원되지 않습니다.
Spring @Controller로 x-www-form-urlencoded 문제 에 대한 답변 을 기반으로
아래 @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"
}
[추신 : 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가 Spring에서 작동하지 않는 Http Post 요청
이제 메소드 매개 변수를 표시하기 만하면 @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
이런 식으로 Spring은 콘텐츠를 구문 분석하는 방법을 알고 있습니다.
이 StackOverflow 답변 에서 대안에 대해 썼습니다 .
거기에 코드로 설명하면서 단계별로 작성했습니다. 짧은 방법 :
첫째 : 개체 작성
두 번째 : AbstractHttpMessageConverter를 확장하는 모델 매핑을위한 변환기 생성
셋째 : configureMessageConverters 메서드를 재정의하는 WebMvcConfigurer.class를 구현하는이 변환기를 사용하도록 봄에 알립니다.
Fourth and final: using this implementation setting in the mapping inside your controller the consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE and @RequestBody in front of your object.
I'm using spring boot 2.
In Spring 5
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam MultiValueMap body ) {
// import org.springframework.util.MultiValueMap;
String datax = (String) body .getFirst("datax");
}
Instead of using a Map, you can use the parameters directly:
@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
}
'program tip' 카테고리의 다른 글
PowerPivot, PowerQuery 및 PowerBI의 차이점 (0) | 2020.11.17 |
---|---|
Ansible : 속성별로 목록 필터링 (0) | 2020.11.17 |
800px 이후 scrollDown에 div 표시 (0) | 2020.11.16 |
ImageMagick / RMagick-RMagick 2.13.1을 설치할 수 없습니다. (0) | 2020.11.16 |
부호없는 정수와 부호있는 정수의 성능 (0) | 2020.11.16 |