2012-07-20 51 views
30

我正在用RestTemplate挣扎。我需要将一些身份验证信息发布到其他Web服务。我可以发送请求并收到回复。但根据回应,我的标题参数没有通过。 (发送相同的请求与SOAPUI正常工作)Spring RestTemplate带有标题的postForObject:webservice找不到我的标题参数

这是我的代码:

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
headers.add("companyId", companyId); 
headers.add("password", password);    

HttpEntity<String> request = new HttpEntity<String>(headers); 

RestTemplate restTemplate = new RestTemplate(); 

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
messageConverters.add(new MappingJacksonHttpMessageConverter());   
restTemplate.setMessageConverters(messageConverters); 

LoginResponse response = (LoginResponse)restTemplate.postForObject(url, request, LoginResponse.class); 

任何人谁可以告诉我,这有什么错我的HttpEntity或的HTTPHeader?

谢谢。

解决:

好吧,终于得到了它的工作。

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
map.add("companyId", companyId); 
map.add("password", password); 

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);  

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); 

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
messageConverters.add(new MappingJacksonHttpMessageConverter());  
messageConverters.add(new FormHttpMessageConverter()); 
restTemplate.setMessageConverters(messageConverters); 

LoginResponse response = (LoginResponse) restTemplate.postForObject(url, request, LoginResponse.class); 

因为我也对响应很难,也许它可以对他人有用:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ItcLoginResponse { 

    public String loginToken; 

    @JsonProperty("token") 
    public String getLoginToken() { 
     return loginToken; 
    } 

    public void setLoginToken(String loginToken) { 
     this.loginToken = loginToken; 
    } 
} 
+0

更新:使用“MappingJackson2HttpMessageConverter”,而不是旧“MappingJacksonHttpMessageConverter” – Udo 2014-10-16 03:23:26

+0

它看起来像你的解决方案中的messageConverters实例未使用?! – 2017-04-27 06:20:20

回答

5

你设置标头指示要发布的形式(APPLICATION_FORM_URLENCODED)但随后将companyId和密码设置为HTTP标头。

我怀疑你希望这些字段位于请求的正文中。

您还在创建一个HttpEntity<String>这表明您将发布包含String的请求主体,但是您提供的是标题但不包含String。

如果这不能帮助您解决问题,也许您可​​以解释请求应该是什么样子。

-1

您可以设置头的值作为授权

//设置用户名和密码用于创建基本认证请求

HttpAuthentication authHeader = new HttpBasicAuthentication(username, password); 
HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.setAuthorization(authHeader); 
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders); 

// Create a new RestTemplate instance 
RestTemplate restTemplate = new RestTemplate(); 

// Add the String message converter 
restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 

try { 

    // Make the HTTP GET request to the Basic Auth protected URL 
    ResponseEntity<Message> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); 

    return response.getBody(); 

} catch (HttpClientErrorException e) { 

    Log.e(TAG, e.getLocalizedMessage(), e); 
    // Handle 401 Unauthorized response 
} 
+3

您使用的是哪个'HttpHeaders'版本? Mine没有'setAuthorization(..)'方法。 – Abdull 2015-02-12 12:28:18

+0

问题是关于邮政电话没有打到电话 – user2531799 2017-07-25 11:39:48