[java] JSON의 RestTemplate을 통한 POST 요청

내 문제를 해결하는 방법에 대한 예를 찾지 못해서 도움을 요청하고 싶습니다. JSON의 RestTemplate 개체를 사용하여 POST 요청을 보낼 수 없습니다.

내가 얻을 때마다 :

org.springframework.web.client.HttpClientErrorException : 415 지원되지 않는 미디어 유형

이 방식으로 RestTemplate을 사용합니다.

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);

내 잘못이 뭐야?



답변

이 기술은 저에게 효과적이었습니다.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

이게 도움이 되길 바란다


답변

REST 엔드 포인트를 디버그하려고 할 때이 문제가 발생했습니다. 다음은 내가 사용한 POST 요청을 만들기 위해 Spring의 RestTemplate 클래스를 사용하는 기본 예제입니다. 다른 곳의 코드를 모아서 작동하는 버전을 얻는 데 꽤 오랜 시간이 걸렸습니다.

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);

특정 JSON 파서 내 나머지 끝점은 필드 이름 주위에 필요한 큰 따옴표를 사용했기 때문에 requestJson String에서 큰 따옴표를 이스케이프했습니다.


답변

다음과 같이 JSONObjects와 함께 나머지 템플릿을 사용하고 있습니다.

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}


답변

지정된대로 여기 난 당신을 추가 할 필요가 추측 messageConverter에 대해 MappingJacksonHttpMessageConverter


답변

Spring 3.0을 사용하는 경우 org.springframework.web.client.HttpClientErrorException : 415 Unsupported Media Type 예외 를 피하는 쉬운 방법 은 클래스 경로에 jackson jar 파일을 포함하고 mvc:annotation-drivenconfig 요소를 사용하는 것 입니다. 여기에 지정된대로 .

mvc-ajax 앱 이 .NET Framework에 대한 특별한 구성없이 작동 하는 이유를 알아 내려고 노력 하고 MappingJacksonHttpMessageConverter있었습니다. 위에 링크 된 기사를 자세히 읽으면 :

내부적으로 Spring MVC는 직렬화를 수행하기 위해 HttpMessageConverter에 위임합니다. 이 경우 Spring MVC는 Jackson JSON 프로세서에 구축 된 MappingJacksonHttpMessageConverter를 호출합니다. 이 구현은 클래스 경로에 Jackson이있는 mvc : annotation-driven 구성 요소를 사용할 때 자동으로 활성화됩니다 .


답변

“415 Unsupported Media Type”오류는 서버가 POST 요청을 수락하지 않을 것임을 알려줍니다. 귀하의 요청은 절대적으로 괜찮습니다. 잘못 구성된 서버입니다.

MappingJacksonHttpMessageConverter자동으로 요청 내용 유형 헤더를로 설정하고 application/json서버가 거부하는 것 같습니다. 하지만 서버 설정에 대해 아무 말도하지 않았으므로 이에 대해 조언 해 드릴 수 없습니다.


답변

나는 이런 식으로하고 있으며 작동합니다.

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}

// 여기에 헤더 전달

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());

도움이 되었기를 바랍니다