Подтвердить что ты не робот

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

Как я могу отправить запрос GET с помощью Spring RestTemplate? Другие вопросы использовали POST, но мне нужно использовать GET. Когда я запускаю это, программа продолжает работать, но кажется, что сеть забита, потому что это в 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);
4b9b3361

Ответ 1

Метод 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

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

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

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