복붙노트

[SPRING] Spring RestTemplate 요청에 "Accept :"헤더를 설정하는 방법?

SPRING

Spring RestTemplate 요청에 "Accept :"헤더를 설정하는 방법?

Spring의 RestTemplate을 사용하여 요청할 때 Accept : 값을 설정하려고합니다.

Spring 요청 처리 코드입니다.

@RequestMapping(
    value= "/uom_matrix_save_or_edit", 
    method = RequestMethod.POST,
    produces="application/json"
)
public @ResponseBody ModelMap uomMatrixSaveOrEdit(
    ModelMap model,
    @RequestParam("parentId") String parentId
){
    model.addAttribute("attributeValues",parentId);
    return model;
}

다음은 Java REST 클라이언트입니다.

public void post(){
    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
    params.add("parentId", "parentId");
    String result = rest.postForObject( url, params, String.class) ;
    System.out.println(result);
}

이것은 나를 위해 일합니다. JSON 문자열을 서버 측에서 가져옵니다.

제 질문은 : RestTemplate을 사용할 때 Accept : 헤더 (예 : application / json, application / xml, ...) 및 요청 메소드 (예 : GET, POST 등)를 어떻게 지정할 수 있습니까?

해결법

  1. ==============================

    1.HttpHeaders를 설정할 수있는 HttpEntity를 받아들이는 교환 메소드 중 하나를 사용하는 것이 좋습니다. (사용할 HTTP 메소드를 지정할 수도 있습니다.)

    HttpHeaders를 설정할 수있는 HttpEntity를 받아들이는 교환 메소드 중 하나를 사용하는 것이 좋습니다. (사용할 HTTP 메소드를 지정할 수도 있습니다.)

    예를 들어,

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    
    HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
    
    restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
    

    강하게 입력 된이 솔루션을 선호합니다. exchange는 HttpEntity를 기대합니다.

    그러나 HttpEntity를 요청 인수로 postForObject에 전달할 수도 있습니다.

    HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
    restTemplate.postForObject(url, entity, String.class); 
    

    이것은 RestTemplate # postForObject Javadoc에 언급되어있다.

  2. ==============================

    2.요청을 보낼 때마다 헤더를 설정하지 않으려면 RestTemplate에 인터셉터 "ClientHttpRequestInterceptor"를 설정할 수 있습니다.

    요청을 보낼 때마다 헤더를 설정하지 않으려면 RestTemplate에 인터셉터 "ClientHttpRequestInterceptor"를 설정할 수 있습니다.

    public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor {
    
            private final String headerName;
    
            private final String headerValue;
    
            public HeaderRequestInterceptor(String headerName, String headerValue) {
                this.headerName = headerName;
                this.headerValue = headerValue;
            }
    
            @Override
            public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
                request.getHeaders().set(headerName, headerValue);
                return execution.execute(request, body);
            }
        }
    

    그때

    List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
    interceptors.add(new HeaderRequestInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE));
    
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setInterceptors(interceptors);
    
  3. ==============================

    3.나처럼, 기본 인증과 나머지 템플릿 교환 API로 헤더를 사용하는 예제를 찾으려 고 노력했다면, 이것이 내가 마침내 해결 한 것입니다 ...

    나처럼, 기본 인증과 나머지 템플릿 교환 API로 헤더를 사용하는 예제를 찾으려 고 노력했다면, 이것이 내가 마침내 해결 한 것입니다 ...

    private HttpHeaders createHttpHeaders(String user, String password)
    {
        String notEncoded = user + ":" + password;
        String encodedAuth = Base64.getEncoder().encodeToString(notEncoded.getBytes());
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("Authorization", "Basic " + encodedAuth);
        return headers;
    }
    
    private void doYourThing() 
    {
        String theUrl = "http://blah.blah.com:8080/rest/api/blah";
        RestTemplate restTemplate = new RestTemplate();
        try {
            HttpHeaders headers = createHttpHeaders("fred","1234");
            HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
            ResponseEntity<String> response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, String.class);
            System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
        }
        catch (Exception eek) {
            System.out.println("** Exception: "+ eek.getMessage());
        }
    }
    
  4. ==============================

    4.코드 : 템플릿을 사용하여 나머지 API 호출하기

    코드 : 템플릿을 사용하여 나머지 API 호출하기

    1)

           RestTemplate restTemplate = new RestTemplate();
            // Add the Jackson message converter
            restTemplate.getMessageConverters().add(new 
               MappingJackson2HttpMessageConverter());
    
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.set("Authorization", "Basic XXXXXXXXXXXXXXXX=");
            HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    
            restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(USERID, PWORD));
    
            String requestJson = getRequetJson(Code, emailAddr, firstName, lastName);
            //
            response = restTemplate.postForObject(URL, requestJson, MYObject.class);
    

    또는

    2)

        RestTemplate restTemplate = new RestTemplate();
        String requestJson = getRequetJson(code, emil, name, lastName);
    
        //
        HttpHeaders headers = new HttpHeaders();
        String userPass = USERID + ":" + PWORD;
        String authHeaderValue = "Basic " + Base64.getEncoder().encodeToString(userPass.getBytes());
        headers.set(HttpHeaders.AUTHORIZATION, authHeaderValue);
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        HttpEntity<String> request = new HttpEntity<String>(requestJson, headers);
        //
        ResponseEntity<MyObject> responseEntity =this.restTemplate.exchange(URI, HttpMethod.POST, request, MyObject.class);
    
        responseEntity.getBody()
    

    json 객체를 만드는 메소드

        private String getRequetJson(String Code, String emailAddr, String firstName, String lastName) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode rootNode = mapper.createObjectNode();
    
            ((ObjectNode) rootNode).put("code", Code);
            ((ObjectNode) rootNode).put("email", emailAdd);
            ((ObjectNode) rootNode).put("firstName", firstname);
            ((ObjectNode) rootNode).put("lastName", lastname);
    
            String jsonString = null;
            try {
                jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
            } catch (JsonProcessingException e) {
    
                e.printStackTrace();
            }
            return jsonString;
    
        }
    
  5. ==============================

    5.다음은 간단한 대답입니다. 누군가가 도움이되기를 바랍니다.

    다음은 간단한 대답입니다. 누군가가 도움이되기를 바랍니다.

    import org.springframework.boot.devtools.remote.client.HttpHeaderInterceptor;
    import org.springframework.http.MediaType;
    import org.springframework.http.client.ClientHttpRequestInterceptor;
    import org.springframework.web.client.RestTemplate;
    
    
    public String post(SomeRequest someRequest) {
        // create a list the headers 
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new HttpHeaderInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE));
        interceptors.add(new HttpHeaderInterceptor("ContentType", MediaType.APPLICATION_JSON_VALUE));
        interceptors.add(new HttpHeaderInterceptor("username", "user123"));
        interceptors.add(new HttpHeaderInterceptor("customHeader1", "c1"));
        interceptors.add(new HttpHeaderInterceptor("customHeader2", "c2"));
        // initialize RestTemplate
        RestTemplate restTemplate = new RestTemplate();
        // set header interceptors here
        restTemplate.setInterceptors(interceptors);
        // post the request. The response should be JSON string
        String response = restTemplate.postForObject(Url, someRequest, String.class);
        return response;
    }
    
  6. from https://stackoverflow.com/questions/19238715/how-to-set-an-accept-header-on-spring-resttemplate-request by cc-by-sa and MIT license