IT

Spring RestTemplate 요청에 "Accept :"헤더를 설정하는 방법은 무엇입니까?

lottoking 2020. 5. 27. 07:47
반응형

Spring RestTemplate 요청에 "Accept :"헤더를 설정하는 방법은 무엇입니까?


Accept:Spring 's 사용하여 요청에서 의 값을 설정하고 싶습니다 RestTemplate.

다음은 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 문자열을 얻습니다.

내 질문은 : 나는 지정할 수있는 방법 Accept:헤더 (예를 들어 application/json, application/xml(예를 들어, ...) 요청 방법 GET, POST...) 나는 RestTemplate를 사용할 수 있습니까?


을 설정할 수 있는 exchange방법 중 하나를 사용하는 것이 좋습니다 . 사용하려는 HTTP 메소드를 지정할 수도 있습니다.HttpEntityHttpHeaders

예를 들어

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

HttpEntity<String> entity = new HttpEntity<>("body", headers);

restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

이 솔루션은 강력하게 입력되기 때문에 선호합니다. exchange기대합니다 HttpEntity.

그러나 HttpEntity이를 request인수로 전달할 수도 있습니다 postForObject.

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

이것은 RestTemplate#postForObjectJavadoc에 언급되어 있습니다.

request매개 변수가 될 수 있습니다 HttpEntity에 주문 요청에 추가 HTTP 헤더를 추가 .


요청을 보낼 때마다 헤더를 설정하지 않도록 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);

나처럼 기본 인증과 나머지 템플릿 교환 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());
    }
}

코드 : 템플릿을 사용하여 나머지 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;

    }

다음은 간단한 답변입니다. 그것이 누군가를 돕기를 바랍니다.

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

참고URL : https://stackoverflow.com/questions/19238715/how-to-set-an-accept-header-on-spring-resttemplate-request

반응형