我们在项目中使用Spring-Integration。我遇到了http:outbound-gateway
的奇怪问题。我们需要传递以下标头来执行休息服务。
1)Accept=application/vnd.dsths.services-v1+xml
2)Content-Type=application/xml
奇怪的是,返回的响应并不总是唯一的。在开发环境中,返回xml响应(Content-Type=application/vnd.dsths.services-v1+xml
),而在客户端环境中,返回json响应(Content-Type=application/vnd.dsths.services-v1+json
)。我打开DEBUG
验证了日志文件,发现org.springframework.web.client.RestTemplate
是设置请求接受标头为[text / plain,application / json,application / * + json,* /`*]。
2017-07-10 16:17:11,563 DEBUG [org.springframework.web.client.RestTemplate] (ajp-/10.226.55.163:8009-1) Setting request Accept header to [text/plain, application/json, application/*+json, */*]
我可以通过在客户端环境中覆盖accept=*/*
到accept=application/vnd.dsths.services-v1+xml
的值来解决此问题(请注意,此标头不是实际的" Accept
& #34;标题)。
这里的问题是为什么http:outbound-gateway
表现得很奇怪并操纵标题值?为什么Spring Integration无法识别标题与"accept"
和"Accept"
之间的区别?我的修正是否正确?
答案 0 :(得分:0)
不确定差异的问题是什么,但根据RFC-2616 HTTP标头不区分大小写:Are HTTP headers case-sensitive?。
DefaultHttpHeaderMapper
遵循以下建议:
private void setHttpHeader(HttpHeaders target, String name, Object value) {
if (ACCEPT.equalsIgnoreCase(name)) {
if (value instanceof Collection<?>) {
你所展示的是Spring MVC的一部分,远离Spring Integration。请参阅RestTemplate
代码:
public void doWithRequest(ClientHttpRequest request) throws IOException {
if (this.responseType != null) {
Class<?> responseClass = null;
if (this.responseType instanceof Class) {
responseClass = (Class<?>) this.responseType;
}
List<MediaType> allSupportedMediaTypes = new ArrayList<>();
for (HttpMessageConverter<?> converter : getMessageConverters()) {
if (responseClass != null) {
if (converter.canRead(responseClass, null)) {
allSupportedMediaTypes.addAll(getSupportedMediaTypes(converter));
}
}
else if (converter instanceof GenericHttpMessageConverter) {
GenericHttpMessageConverter<?> genericConverter = (GenericHttpMessageConverter<?>) converter;
if (genericConverter.canRead(this.responseType, null, null)) {
allSupportedMediaTypes.addAll(getSupportedMediaTypes(converter));
}
}
}
if (!allSupportedMediaTypes.isEmpty()) {
MediaType.sortBySpecificity(allSupportedMediaTypes);
if (logger.isDebugEnabled()) {
logger.debug("Setting request Accept header to " + allSupportedMediaTypes);
}
request.getHeaders().setAccept(allSupportedMediaTypes);
}
}
}
正如您所看到的那样,逻辑基于提供的HttpMessageConverter
,而且老实说,这是正确的。 Accept
标头正是客户端可以从服务器处理的内容。
如果您不喜欢此类行为而且您确信在您的客户中,则可以RestTemplate
向http:outbound-gateway
注入HttpMessageConverter
,但只需要select Week_No,Day_Of_Week
from
( select top(53) row_number() over( order by (select null)) Week_No
from sys.all_objects) w
cross join
( select top(5) row_number() over( order by (select null)) Day_Of_Week
from sys.all_objects) d
order by Week_No,Day_Of_Week
。