HTTP получить с заголовками, используя RestTemplate

Как я могу отправить GET-запрос, используя Spring RestTemplate? Другие вопросы использовали 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);

3 ответа

Решение

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() чтобы получить свой результат.

Этот вопрос похож на этот вопрос.

Взгляните на JavaDoc для RestTemplate.

Есть соответствующий getForObject методы, которые являются HTTP GET эквивалентами postForObject, но они не соответствуют вашим требованиям "GET with headers", так как нет никакого способа указать заголовки ни для одного из вызовов.

Если посмотреть на JavaDoc, ни один метод, специфичный для HTTP GET, не позволяет вам также предоставлять информацию заголовка. Хотя есть альтернативы, один из которых вы нашли и используете. exchange методы позволяют вам обеспечить HttpEntity объект, представляющий детали запроса (включая заголовки). execute методы позволяют вам указать RequestCallback из которого вы можете добавить заголовки при его вызове.

Метод getForObject() в RestTemplate не поддерживает настройку заголовков. вы можете использовать это

syntax:

restTemplate.exchange(конечная точка URL,HttpMethod.GET, сущность, параметры)

      public List<Employee> getListofEmployee()
 {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>(headers);
    ResponseEntity<List<Employee>> response = restTemplate.exchange("http://hello-server/rest/employees",
    HttpMethod.GET,entity, new ParameterizedTypeReference<List<Employee>>() {});
    return response.getBody(); //this returns List of Employee 
  }
Другие вопросы по тегам