使用自定义 Headers 的 Resttemplate GET 请求
Resttemplate GET Request with Custom Headers
我需要发送带有 header 的 GET 请求:Content-Type: application/camiant-msr-v2.0+xml
。我期待来自服务器的 XML 响应。我用 Postman 测试了请求和响应,一切都很好。但是当我尝试在 Spring 中使用 RestTemplate
执行此操作时,我总是收到 400 错误请求。 spring
的例外情况是:
Jul 09, 2016 12:53:38 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/smp] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 400 Bad Request] with root cause
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475)
我的代码:
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Content-Type", "application/camiant-msr-v2.0+xml");
HttpEntity<?> entity = new HttpEntity<Object>(headers);
log.debug("request headers: " + entity.getHeaders());
ResponseEntity<String> response = restTemplate.exchange(queryUrl, HttpMethod.GET, entity, String.class);
调试消息将 header 显示为 {Content-Type=[application/camiant-msr-v2.0+xml]}
,这似乎是正确的。我想知道我的请求有什么问题,是否有办法查看在线请求以进行调试。
400
的可能解释是请求不接受内容类型或 url 不匹配。
根据我的个人经验,我强烈感觉你在搞乱 queryUrl
所以要在这里进行微调,我建议你使用 Spring 的 UriComponentsBuilder
class。
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("data", data);
HttpEntity<?> entity = new HttpEntity<>(headers);
HttpEntity<String> response = restTemplate.exchange(
builder.build().encode().toUri(),
HttpMethod.GET,
entity,
String.class);
如果还是不行,请告诉我。
实际上要传递的 header 应该命名为 Accept
而不是 Content-Type
,因为它是一个 GET 方法。但是服务器 API 文档不知何故说它期望 Content-Type
,并且来自命令 line/Postman 的 API 在 Content-Type
和 Accept
上都运行良好。我认为是 Java 库阻止 Content-Type
header 传递给 GET 请求。
以下对我有用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
@Service
public class Http {
@Autowired
private RestTemplate restTemplate;
public String doGet(final String url) throws Exception {
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0");
headers.add(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en;q=0.8");
HttpEntity<?> entity = new HttpEntity<Object>(headers);
HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
return response.getBody();
}
}
我需要发送带有 header 的 GET 请求:Content-Type: application/camiant-msr-v2.0+xml
。我期待来自服务器的 XML 响应。我用 Postman 测试了请求和响应,一切都很好。但是当我尝试在 Spring 中使用 RestTemplate
执行此操作时,我总是收到 400 错误请求。 spring
的例外情况是:
Jul 09, 2016 12:53:38 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/smp] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 400 Bad Request] with root cause
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475)
我的代码:
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Content-Type", "application/camiant-msr-v2.0+xml");
HttpEntity<?> entity = new HttpEntity<Object>(headers);
log.debug("request headers: " + entity.getHeaders());
ResponseEntity<String> response = restTemplate.exchange(queryUrl, HttpMethod.GET, entity, String.class);
调试消息将 header 显示为 {Content-Type=[application/camiant-msr-v2.0+xml]}
,这似乎是正确的。我想知道我的请求有什么问题,是否有办法查看在线请求以进行调试。
400
的可能解释是请求不接受内容类型或 url 不匹配。
根据我的个人经验,我强烈感觉你在搞乱 queryUrl
所以要在这里进行微调,我建议你使用 Spring 的 UriComponentsBuilder
class。
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("data", data);
HttpEntity<?> entity = new HttpEntity<>(headers);
HttpEntity<String> response = restTemplate.exchange(
builder.build().encode().toUri(),
HttpMethod.GET,
entity,
String.class);
如果还是不行,请告诉我。
实际上要传递的 header 应该命名为 Accept
而不是 Content-Type
,因为它是一个 GET 方法。但是服务器 API 文档不知何故说它期望 Content-Type
,并且来自命令 line/Postman 的 API 在 Content-Type
和 Accept
上都运行良好。我认为是 Java 库阻止 Content-Type
header 传递给 GET 请求。
以下对我有用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
@Service
public class Http {
@Autowired
private RestTemplate restTemplate;
public String doGet(final String url) throws Exception {
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0");
headers.add(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en;q=0.8");
HttpEntity<?> entity = new HttpEntity<Object>(headers);
HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
return response.getBody();
}
}