POST request не добавляет запрошенные заголовки в RestTemplate
Я должен получить User
, отправив POST-запрос:
POST http://myurl.com/rest/user/getbyusername/{user} HTTP/1.0
token: uonIQz8WNE7UB5iR2V0ZYQ==
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;)
Pragma: no-cache
Content-Length: 0
Host: myurl.com
Я пытаюсь сделать это, используя этот фрагмент кода:
private User getByUsername(String username) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
List<String> list = new ArrayList<>();
list.add(Params.token);
headers.put("token", list);
return restTemplate.postForObject("http://myurl.com/rest/user/getbyusername/{username}", headers, User.class,
username);
}
Контроллер:
@ResponseBody
@RequestMapping(value = "getbyusername/{username}",
produces = "application/json",
method=RequestMethod.POST)
public String getByUsername(@PathVariable("username")
String username, HttpServletRequest request)
throws IOException {
if (!request.getHeader(headerName).isEmpty() && StringUtils.isNotBlank(token)
&& request.getHeader(headerName).equals(token)) {...}
}
К сожалению, результат таков Error 404
. В моем коде чего-то не хватает или я делаю это совершенно неправильно? Заранее спасибо
1 ответ:
Вы не можете установить заголовки, как вы делаете в настоящее время, вам нужно будет обернуть ваш запрос в
HttpEntity
, например:RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.set("token", Params.token); HttpEntity<String> entity = new HttpEntity<>(username, headers); restTemplate.postForObject("http://myurl.com/rest/user/getbyusername/{username}", entity, User.class);
Этот подход рекомендуется в
postForObject
Javadocs .В качестве альтернативы вы можете реализовать
ClientHttpRequestInterceptor
который будет добавлять заголовокtoken
к каждому запросу. Затем вы бы установили это наRestTemplate
:restTemplate.setInterceptors(new LinkedList<>(new MyTokenHeaderAddingInterceptor()));
Это избавит вас от необходимости не забывать отправлять заголовок для каждого запроса.