2015-02-12 3 views
2

Я должен получить User, отправив запрос POST:POST не добавляет запрашиваемые заголовки в RestTemplate

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. Не хватает ли в моем коде чего-то или я делаю это совершенно неправильно? Заранее спасибо

ответ

2

Вы не можете установить заголовки, как вы сейчас делаете, вам нужно будет обернуть ваш запрос в 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())); 

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

Смежные вопросы