복붙노트

[SPRING] RestTemplate을 사용하여 HTTP로 헤더 가져 오기

SPRING

RestTemplate을 사용하여 HTTP로 헤더 가져 오기

Spring RestTemplate을 사용하여 GET 요청을 보내려면 어떻게해야합니까? POST를 사용하는 다른 질문이 있지만 GET을 사용해야합니다. 이 프로그램을 실행하면 프로그램이 계속 작동하지만이 프로그램이 AsyncTask에 있기 때문에 네트워크가 막히고이 버튼을 클릭 한 후에 다른 asynctask를 실행하려고하면 네트워크가 작동하지 않는 것으로 보입니다.

나는 노력했다.

        String url = "https://api.blah.com/2.0/search/cubes?w=jdfkl&whitespace=1";

        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("Bearer", accessToken);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //copied this from somewhere else, not sure what its for

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

        HttpMessageConverter<String> stringConverter = new StringHttpMessageConverter();
        FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
        List<HttpMessageConverter<?>> msgConverters = new ArrayList<HttpMessageConverter<?>>();


        msgConverters.add(formConverter);
        msgConverters.add(new MappingJacksonHttpMessageConverter());
        msgConverters.add(stringConverter); 

        template.setMessageConverters(msgConverters);
        //SetSearchResponseData is my custom class to store the incoming JSON
        ResponseEntity<SetSearchResponseData> result = template.exchange(url, HttpMethod.GET, request, SetSearchResponseData.class);
        //If I was using post, i could have done SetSearchResponseDataresponse = restTemplate.postForObject(url, request, SetSearchResponseData.class);

해결법

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

    1.RestTemplate getForObject () 메소드는 헤더 설정을 지원하지 않습니다. 해결 방법은 exchange () 메서드를 사용하는 것입니다.

    RestTemplate getForObject () 메소드는 헤더 설정을 지원하지 않습니다. 해결 방법은 exchange () 메서드를 사용하는 것입니다.

    따라서 restTemplate.getForObject (url, String.class, param) (헤더가 없음) 대신 다음을 사용하십시오.

    HttpHeaders headers = new HttpHeaders();
    headers.set("Header", "value");
    headers.set("Other-Header", "othervalue");
    ...
    
    HttpEntity entity = new HttpEntity(headers);
    
    ResponseEntity<String> response = restTemplate.exchange(
        url, HttpMethod.GET, entity, String.class, param);
    

    마지막으로 response.getBody ()를 사용하여 결과를 얻으십시오.

    이 질문은이 질문과 유사합니다.

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

    2.RestTemplate 용 JavaDoc을 살펴 보자.

    RestTemplate 용 JavaDoc을 살펴 보자.

    postForObject의 HTTP GET에 상응하는 getForObject 메소드가 있지만 호출에서 헤더를 지정할 수있는 방법이 없으므로 "GET with headers"요구 사항을 충족시키지 못합니다.

    JavaDoc을 살펴보면 HTTP GET에만 해당되는 메소드가 없기 때문에 헤더 정보도 제공 할 수 있습니다. 대안이 있지만 그 중 하나는 사용 중이며 사용하고 있습니다. 교환 메서드를 사용하면 요청의 세부 정보 (헤더 포함)를 나타내는 HttpEntity 객체를 제공 할 수 있습니다. execute 메소드를 사용하면 호출시 헤더를 추가 할 수있는 RequestCallback을 지정할 수 있습니다.

  3. from https://stackoverflow.com/questions/16781680/http-get-with-headers-using-resttemplate by cc-by-sa and MIT license