programing

JSON의 RestTemplate를 통한 POST 요청

newsource 2023. 1. 10. 21:11

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-drivenconfig 요소여기에 명시된 바와 같이.

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를 생성하도록 하는 데 .POSTparameterparameter가 입니다. 파라미터 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