关于java:带有标头的Spring RestTemplate postForObject:Web服务找不到我的标头参数

 2021-04-09 

Spring RestTemplate postForObject with Header: webservice can't find my header parameters

我正在为RestTemplate苦苦挣扎。我需要将一些身份验证信息发布到其余的Web服务。我可以发送请求,并且得到响应。但是根据响应,我的头参数没有通过。 (使用SOAPUI发送相同的请求可以正常工作)

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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出了什么问题?

谢谢。

已解决:

好,终于可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);

因为我也很难回答,也许对其他人可能有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@JsonIgnoreProperties(ignoreUnknown = true)
public class ItcLoginResponse {

    public String loginToken;

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

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


您正在设置标头,指示要发布表单(APPLICATION_FORM_URLENCODED),但随后将companyId和password设置为HTTP标头。

我怀疑您希望这些字段出现在请求的正文中。

您还将创建一个HttpEntity<String>,它指示要发布包含字符串的请求正文,但要提供标头而不提供字符串。

如果这不能帮助您解决问题,则可以解释该请求的外观。