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 엔드포인트를 디버깅하려고 할 때 이 문제가 발생했습니다.다음으로 Spring의 RestTemplate 클래스를 사용한 POST 요청의 기본적인 예를 나타냅니다.다른 곳에서 코드를 조합하여 작업 버전을 얻는 데 꽤 오랜 시간이 걸렸습니다.
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);
rest endpoint에서 사용하고 있는 특정 JSON 파서는 필드 이름 주위에 큰따옴표가 필요했기 때문에 requestJson String에서 큰따옴표를 사용하지 않았습니다.
JSONObjects에서 다음과 같이 rest 템플릿을 사용하고 있습니다.
// 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
이렇게 하고 있는데 잘 되네.
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());
도움이 되었으면 좋겠다
Spring 3.0을 사용하는 경우 org.spring framework를 피하는 쉬운 방법입니다.web.client.HttpClientErrorException: 415 Unsupported Media Type 예외는 클래스 경로에 Jackson jar 파일을 포함하여 사용하는 것입니다.mvc:annotation-driven
config 요소여기에 명시된 바와 같이.
왜 mvc-ajax 앱이 특별한 구성 없이 동작하는지 알아내려고 머리를 쥐어짜고 있었다.MappingJacksonHttpMessageConverter
위에서 링크한 기사를 자세히 읽어보시면:
Spring MVC는 Http Message Converter에 시리얼화를 위임합니다.이 경우 Spring MVC는 Jackson JSON 프로세서 상에 구축된 MappingJacksonHttpMessageConverter를 호출합니다.이 구현은 클래스 경로에 Jackson이 있는 상태에서 mvc:annotation-driven 구성 요소를 사용하면 자동으로 활성화됩니다.
"415 Unsupported Media Type" 오류는 서버가 사용자의 POST 요청을 받아들이지 않음을 나타냅니다.요청은 문제 없습니다. 잘못 구성된 서버입니다.
MappingJacksonHttpMessageConverter
요구 내용 유형 헤더를 자동으로 설정합니다.application/json
서버가 이를 거부하고 있는 것 같습니다.하지만 서버 설정에 대해서는 아무 말도 하지 않으셨기 때문에 조언해 드릴 수 없습니다.
왜 당신은 필요 이상으로 열심히 일하나요? postForEntity
것을 Map
이치노봄철에 지정된 REST 엔드포인트에 대한 테스트를 작성할 때 다음과 같은 작업이 가능합니다.할 수 방법이라고 합니다.JSON POST 요청은 다음과 같습니다.
@Test
public void shouldLoginSuccessfully() {
// 'restTemplate' below has been @Autowired prior to this
Map map = new HashMap<String, String>();
map.put("username", "bob123");
map.put("password", "myP@ssw0rd");
ResponseEntity<Void> resp = restTemplate.postForEntity(
"http://localhost:8000/login",
map,
Void.class);
assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}
이 문제가 발생하여 클라이언트에서는 Spring의 RestTemplate를 사용하고 서버에서는 Spring Web을 사용하고 있습니다.두 API 모두 오류 보고 기능이 매우 부족하여 개발하기가 매우 어렵습니다.
여러 가지 실험을 해 본 결과, POST body에 대한 null reference를 예상 리스트가 아닌 null로 전달했기 때문에 문제가 발생하고 있음을 알 수 있었습니다.RestTemplate는 늘오브젝트에서 콘텐츠 타입을 판별할 수 없지만 불평은 하지 않습니다.올바른 헤더를 추가한 후 서비스 방식을 입력하기 전에 봄에 다른 서버 측 예외가 발생하기 시작했습니다.
이 수정은 null이 아닌 빈 목록을 클라이언트에서 전달하는 것이었습니다.null이 아닌 오브젝트에는 기본 content-type이 사용되므로 헤더는 필요하지 않습니다.
이 코드는 나에게 유효합니다.
RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);
Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);
응답을 처리하지 않으려면
private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);
프로세스에 대한 응답이 필요한 경우
String result = restTemplate.postForObject(url, entity, String.class);
스프링 부츠에서 다음과 같이 시도했습니다.
ParameterizedTypeReference<Map<String, Object>> typeRef = new ParameterizedTypeReference<Map<String, Object>>() {};
public Map<String, Object> processResponse(String urlendpoint)
{
try{
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
//reqobj
JSONObject request = new JSONObject();
request.put("username", name);
//Or Hashmap
Map<String, Object> reqbody = new HashMap<>();
reqbody.put("username",username);
Gson gson = new Gson();//mvn plugin to convert map to String
HttpEntity<String> entity = new HttpEntity<>( gson.toJson(reqbody), headers);
ResponseEntity<Map<String, Object>> response = resttemplate.exchange(urlendpoint, HttpMethod.POST, entity, typeRef);//example of post req with json as request payload
if(Integer.parseInt(response.getStatusCode().toString()) == HttpURLConnection.HTTP_OK)
{
Map<String, Object> responsedetails = response.getBody();
System.out.println(responsedetails);//whole json response as map object
return responsedetails;
}
} catch (Exception e) {
// TODO: handle exception
System.err.println(e);
}
return null;
}
이 설정에서 오류가 발생했습니다.
AndroidAnnotations
Spring Android RestTemplate Module
★★★★★★★★★★★★。
GsonHttpMessageConverter
Android 에서는 Android를 생성하도록 하는 데 .POST
parameterparameter가 입니다. 파라미터 Simply 파파 new Object()
해결해 주셨어요.
JSON을 직접 매핑하지 않을 경우 다음과 같이 할 수 있습니다.
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);
JSON 개체로 요청할 수 있습니다.
JSONObject request = new JSONObject();
request.put("name","abc");
ResponseEntity<JSONObject> response =restTemplate.postForEntity(append_url,request,JSONObject.class); `enter code here`
언급URL : https://stackoverflow.com/questions/4075991/post-request-via-resttemplate-in-json
'programing' 카테고리의 다른 글
Pivotal Cloud Foundry는 MariaDB를 지원합니까? (0) | 2023.01.10 |
---|---|
기능 프로그래밍 - 불변성은 비용이 많이 드나요? (0) | 2023.01.10 |
사전 목록을 panda DataFrame으로 변환 (0) | 2022.12.26 |
부동값이 정수인지 확인하는 방법 (0) | 2022.12.26 |
C에서는 마이너스 어레이 인덱스를 사용할 수 있습니까? (0) | 2022.12.26 |