当前位置: 首页 > 知识库问答 >
问题:

如何在SI HttpRequest estExecutingMessageHandler中处理“Transfer-Encode=chunked”

白星海
2023-03-14

我正在使用HttpRequestExecutingMessageHandler调用外部服务器。我使用JSON到对象转换器来转换JSON数据。但我有以下例外。

原因:com.fasterxml.jackson.core.JsonParseException:非法字符((CTRL-CHAR,代码31)):在[Source:(String)"的标记之间只允许有规则的空白(\r,\n,\t)

当我检查标题时,我发现了以下内容。传输编码=分块

这就是异常日志的原因吗?

出站网关和JsonToObjectTransformer如下所示:

    @ServiceActivator(inputChannel = "channelOutboundRequest")
    @Bean
    public HttpRequestExecutingMessageHandler outboundGateway() {
        final HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(
                endpoint);
        handler.setExpectedResponseType(String.class);
        handler.setHttpMethod(HttpMethod.POST);
        handler.setOutputChannelName("channelResponse");
        handler.setAdviceChain(Collections.singletonList(advice()));
        return handler;
    }
    @Bean
    @Transformer(inputChannel = "channelResponse", outputChannel = "channelReply")
    public JsonToObjectTransformer transformer(ObjectMapper objectMapper) {
        final JsonObjectMapper<?, ?> mapper = new Jackson2JsonObjectMapper(objectMapper);
        return new JsonToObjectTransformer(DetailsDTO.class, mapper);
    }

如果标头导致问题,如何处理响应?

注意:如果我使用postman直接访问外部服务器,我会收到JSON结构的响应。

我不知道这里怎么了。。如果像下面这样使用简单的重新模板调用,它会正常工作。

JSONObject jsonObject = new JSONObject("{\"code\":\"F001\",\"transactionId\":\"1008566223232\"}");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBearerAuth("token");
        HttpEntity<String> request = 
                  new HttpEntity<String>(jsonObject.toString(), headers);
        String respns = restTemplt.postForObject("http://endpoint", request, String.class);
        System.out.println(respns);
        JSONObject response = new JSONObject(respns);

我能找到的一个区别是响应标题。具体如下:

出站网关响应头:-{传输编码=分块,http\U请求方法=获取,错误通道=org.springframework.messaging.core.GenericMessageTemplate$TemporaryReplyChannel@d8b195e,Server=nginx,Accept=/,Connection=keep-alive,User-Agent=PostmanRuntime/7.28.0,Host=localhost:8901,Accept-Encoding=gzip,deflate,br,http\u-statusCode=200-OK,Date=162253372000,Authorization=Bearer-token,replyChannel=org。springframework。消息传递。果心GenericMessageTemplate$TemporaryReplyChannel@d8b195e,缓存控制=无缓存,ETag=W/“1009-5SzdL uWyY6ZcMWht5dMtm2Sxlc”,内容编码=gzip,http\u请求URL=http://inboundurl,id=be07fc8d-d478-5fa9-33e4-61a2b5f92468,内容长度=207,内容类型=应用程序/json;字符集=utf-8,内容类型=应用程序/json,requestFrom=CUSTOM\u标头,时间戳=16225330 92827}

普通restTemplate调用响应标头[服务器:“nginx”,日期:“Tue,2021 6月1日07:34:54 GMT”,内容类型:“application/json;charset=utf-8”,内容长度:“4105”,连接:“keep alive”,访问控制允许来源:“*”,内容安全策略:“默认src‘self’;基uri‘self’;阻止所有混合内容;font-src‘self’https:数据:;框架祖先‘self’;img src‘self’数据:;object src‘none’;script src‘self’;script src attr‘none’;style src‘self’https:“不安全内联”;升级不安全请求”,X-DNS-Prefetch-Control:“off”,Expect CT:“max age=0”,X-frame-Options:“SAMEORIGIN”,严格的传输安全:“最大年龄=15552000;包括子域”,X-Download-Options:“noopen”,X-Content-Type-Options:“nosniff”,X-allowed-Cross-Domain-Policies:“none”,referer-Policy:“no referer”,X-XSS-Protection:“0”,ETag:“W/”1009-llD9DqxYkEsjyikWajYk 16cb1k“]

有人能帮忙吗?

共有1个答案

姜凯风
2023-03-14

经过多次试验和错误,我找到了原因。Accepe-Encode=gzip, flate, br出站网关请求中的这个标头是根本原因。我得到的响应是一个长字符串,它因为这个标头而被压缩。我在出站网关之前添加了一个标头过滤器来删除这个标头。

    @Bean
    @Transformer(inputChannel = "channelHeaderFilterReq", outputChannel = "channelHeaderFilterRes")
    public HeaderFilter filter() {
        return new HeaderFilter("Accept-Encoding");
    }

现在一切正常...!!

 类似资料:
  • 我上传到S3使用以下代码: 我无法了解boto内部如何处理分段上传的任何信息。我对同样的事情有几个问题,让我们假设我有2.5 MB的文件: 然后文件将分3部分上传,如1,1和.5 MB? 所有3个部分将并行上传还是按顺序上传? 在java的aws库中,我们有转移管理器,在博托中有什么类似的东西吗? 此代码是否足以用于多段上传?因为我遇到了一些复杂的代码示例 任何帮助都将不胜感激。

  • 问题内容: 我想要一个文本区域,可以处理按 Tab 键的情况。 在默认情况下,如果您按 Tab 键,则焦点将离开文本区域。但是,当用户想要在文本区域中输入 Tab 键时会怎样呢? 我可以捕捉到此事件并将焦点返回到文本区域并将标签添加到 当前 光标位置吗? 问题答案:

  • 问题内容: 如何用Java 处理? 问题答案: 我不确定“句柄”是什么意思。 您当然可以捕获该错误: 但这很可能是个坏主意,除非您确切地知道自己在做什么。

  • 问题内容: 我在网上搜索,但没有找到与i18n和Go相关的任何内容。 我希望使用Go来开发网站。处理国际化的最佳方法是什么? 问题答案: go-i18n具有一些不错的功能: 实施CLDR复数规则。 对带变量的字符串使用文本/模板。 翻译文件是简单的JSON。

  • 问题内容: 这是异步发送到我的php页面的JSON。本质上,这是一个产品列表,它将插入到我的mySQL数据库中。 我的问题是在PHP中解码JSON。我可以使用``eval’‘函数在js中做到这一点,但是在PHP中,我的努力导致了一系列复杂的爆炸和内爆函数。 我知道php具有内置的json_decode函数,但是在PHP文档中,它们仅显示如何处理数组。 任何建议或帮助都非常感谢 泰勒 问题答案: 如

  • 问题内容: 我需要在Spring 3.0应用程序中显示自定义消息。我有一个带有Hibernate的数据库,并且有几个约束。我对如何妥善处理存有疑问。我想知道是否有一种方法可以将异常映射到属性文件中的消息集,因为可以在约束验证中进行。我可以以任何方式自动处理它,还是必须在每个控制器中捕获此异常? 问题答案: 在违反约束的情况下显示用户友好消息的问题是,当将Hibernate的转换为Spring的时,