URL 인코딩 데이터가 포함된 Spring RestTemplate POST 요청
저는 봄이 처음이라 휴식 템플릿으로 휴식 요청을 하려고 합니다.Java 코드는 아래 curl 명령과 동일한 작업을 수행해야 합니다.
curl --data "name=feature&color=#5843AD" --header "PRIVATE-TOKEN: xyz" "https://someserver.com/api/v3/projects/1/labels"
그러나 서버는 RestTemplate를 다음과 같이 거부합니다.400 Bad Request
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("PRIVATE-TOKEN", "xyz");
HttpEntity<String> entity = new HttpEntity<String>("name=feature&color=#5843AD", headers);
ResponseEntity<LabelCreationResponse> response = restTemplate.exchange("https://someserver.com/api/v3/projects/1/labels", HttpMethod.POST, entity, LabelCreationResponse.class);
누가 제가 뭘 잘못하고 있는지 말해줄 수 있나요?
서버에 데이터를 보내려고 할 때 "application/json" 또는 "application/x-www-form-urlencoded" 둘 중 하나로 컨텐츠 타입 헤더를 설정하지 않은 것이 문제라고 생각합니다.당신의 경우: "application/x-www-form-urlencoded"는 당신의 샘플 파라미터(이름과 색상)를 기준으로 합니다.이 헤더는 "클라이언트가 서버로 전송하는 데이터 유형"을 의미합니다.
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("PRIVATE-TOKEN", "xyz");
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("name","feature");
map.add("color","#5843AD");
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(map, headers);
ResponseEntity<LabelCreationResponse> response =
restTemplate.exchange("https://foo/api/v3/projects/1/labels",
HttpMethod.POST,
entity,
LabelCreationResponse.class);
컨텐츠 유형을 application/json으로 설정해야 합니다.요청에 Content-Type을 설정해야 합니다.아래는 Content-Type을 설정하기 위해 수정된 코드입니다.
final String uri = "https://someserver.com/api/v3/projects/1/labels";
String input = "US";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("PRIVATE-TOKEN", "xyz");
HttpEntity<String> request = new HttpEntity<String>(input, headers);
ResponseEntity<LabelCreationResponse> response = restTemplate.postForObject(uri, request, LabelCreationResponse.class);
여기서 HttpEntity는 입력한 "US"와 헤더로 구성됩니다.이것이 가능한지 알려주세요, 만약 가능하지 않다면 예외를 공유해주세요.건배!
헤더가 Valid 헤더이면 Header issue check일 수 있는데, BasicAuth 헤더를 말하는 것입니까?
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED.toString());
headers.add("Accept", MediaType.APPLICATION_JSON.toString()); //Optional in case server sends back JSON data
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<String, String>();
requestBody.add("name", "feature");
requestBody.add("color", "#5843AD");
HttpEntity formEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);
ResponseEntity<LabelCreationResponse> response =
restTemplate.exchange("https://example.com/api/request", HttpMethod.POST, formEntity, LabelCreationResponse.class);
나의 문제는.MessageConverters
contains 다른 변환기는 개체를 json(FastJsonHttpMessageConverter)으로 변환할 수 있습니다.그래서 앞에 FormHttp Message Converter를 추가했는데 잘 작동합니다.
<T> JuheResult<T> postForm(final String url, final MultiValueMap<String, Object> body) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
return exchange(url, HttpMethod.POST, requestEntity);
}
<T> JuheResult<T> exchange(final String url, final HttpMethod method, final HttpEntity<?> requestEntity) {
ResponseEntity<JuheResult<T>> response = restTemplate.exchange(url, method, requestEntity,
new JuheResultTypeReference<>());
logger.debug("调用结果 {}", response.getBody());
return response.getBody();
}
public JuheSupplierServiceImpl(RestTemplateBuilder restTemplateBuilder) {
Duration connectTimeout = Duration.ofSeconds(5);
Duration readTimeout = Duration.ofSeconds(5);
restTemplate = restTemplateBuilder.setConnectTimeout(connectTimeout).setReadTimeout(readTimeout)
.additionalInterceptors(interceptor()).build();
restTemplate.getMessageConverters().add(0, new FormHttpMessageConverter());
}
fastjson 다른 미디어를 변환하는 resttemplate를 방지합니다.json 이외의 유형
언급URL : https://stackoverflow.com/questions/49127240/spring-resttemplate-post-request-with-url-encoded-data
'programing' 카테고리의 다른 글
카르마를 사용한 각도 테스트: "모듈이 정의되지 않았습니다." (0) | 2023.10.17 |
---|---|
스프링 부트에서 application.properties의 사용자 홈 경로 가져오기 (0) | 2023.10.17 |
자식 지시 전에 부모 지시를 실행하는 방법? (0) | 2023.10.12 |
문자열에 공백뿐만 아니라 문자와 공백이 포함되어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.10.12 |
도커 오라클 인스턴스에 연결하는 방법 (0) | 2023.10.12 |