programing

URL 인코딩 데이터가 포함된 Spring RestTemplate POST 요청

javamemo 2023. 10. 12. 21:29
반응형

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);

나의 문제는.MessageConverterscontains 다른 변환기는 개체를 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

반응형