Http出站网关正在操纵标头值

时间:2017-07-11 10:39:39

标签: spring-integration

我们在项目中使用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"之间的区别?我的修正是否正确?

1 个答案:

答案 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标头正是客户端可以从服务器处理的内容。

如果您不喜欢此类行为而且您确信在您的客户中,则可以RestTemplatehttp: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