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
из которого вы можете добавить заголовки при его вызове.