【问题标题】:Kettle HTTP Post with utf-8 encoding corrupts soap request xml带有 utf-8 编码的 Kettle HTTP Post 损坏了肥皂请求 xml
【发布时间】:2018-04-12 00:37:07
【问题描述】:

在我的 Kettle 工作中,有一个模块可以使用 HTTP Post 步骤(PDI CE 5.0.1)将 xml soap 请求发送到 wsdl Web 服务器。在我们收到此任务的 Unicode 数据之前,一切都很好。 如果我在 HTTP Post 步骤中将“编码”选项设置为 utf-8,soap xml 请求字符串本身就会损坏(如使用wireshark、网络数据包分析器工具跟踪,最后 2 到 3 行 xml 被截断)导致 HTTP状态 500 错误(com.sun.xml.messaging.saaj.SOAPExceptionImpl:无法内部化消息)。如果禁用此选项,则执行该步骤,但 Unicode 数据使用垃圾字符 (????)。

我已经关注了以下线程,但没有为我工作。 (1)http://forums.pentaho.com/archive/in.../t-133999.html (2)http://forums.pentaho.com/showthread...g-problem-utf8

我觉得这可能是 PDI CE 5.0.1 的错误,并尝试使用 PDI CE 5.2.0A,但没有区别。这是一个错误还是在这里做错了什么?有什么办法可以从 Kettle 发送带有 Unicode 数据的 HTTP soap 请求(不影响性能)?

【问题讨论】:

    标签: pentaho kettle


    【解决方案1】:

    我在使用 PDI 5.2 时遇到了同样的问题(并且也在 4.4 中重现)。

    问题似乎是由于 POST 步骤在转换为 Unicode 之前计算请求正文长度这一事实引起的。然后它使用此长度值设置 Content-Length 标头,这会导致问题,因为实际请求正文在转换为 Unicode 后大于该长度。

    我的解决方法是在 JavaScript 步骤中获取请求的长度,生成等于该长度一半的空格字符串,最后将其附加到请求正文中。您还必须将 Content-Length 标头设置为 JavaScript 步骤中计算的长度(字符串长度 + 字符串长度的一半)。

    它很丑,但它有效。

    例子:

    var contentLen = requestXml.length + ceil(requestXml.length/2);
    
    var padding =  Array(contentLen).join(" ");
    
    requestXml = requestXml + padding;
    

    编辑:

    值得注意的是,JavaScript 步骤还在 Unicode 转换之前获取请求的长度,因此我要附加空格。我无法找到转换后请求的长度。

    【讨论】:

      【解决方案2】:

      我知道这个话题很老了,但是对于那些有同样问题的人来说。使用 RESTClient(而不是 HTTP Post)并将 HTTP 方法设置为“POST”,应用程序类型为“TEXT XML”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 2016-01-31
        相关资源
        最近更新 更多