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 2

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()));

Это избавит вас от необходимости не забывать отправлять заголовок для каждого запроса.