HTTP get с заголовками с помощью 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);

2 ответов


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 получить эквиваленты postForObject, но они, похоже, не отвечают вашим требованиям "GET with headers", так как нет способа указать заголовки в любом из вызовов.

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