'Unconvertable character' 发送包含特殊字符的 HTTPRequestHeader 时 HTTPRequest 节点出现异常

'Unconvertable character' exception in HTTPRequest node when sending a HTTPRequestHeader containing a special character

我在向包含特殊字符的 HTTPRequest 节点发送 HTTPRequestHeader 时遇到 'Unconvertable character' 异常。

调试时 ExceptionList 中的错误:

RecoverableException
    File:CHARACTER:/jenkins/slot0/product-build/WMB/src/CommonServices/ImbConverter.cpp
    Line:INTEGER:733
    Function:CHARACTER:ImbConverterCPP::    
    Type:CHARACTER:
    Name:CHARACTER:
    Label:CHARACTER:
    Catalog:CHARACTER:BIPmsgs
    Severity:INTEGER:3
    Number:INTEGER:2136
    Text:CHARACTER:Unconvertable character
    Insert
            Type:INTEGER:5
            Text:CHARACTER:1920
    Insert
            Type:INTEGER:5
            Text:CHARACTER:4c0061006c0069006100192073002000420075007200690061006c002000460075006e006400200061006e006400200043006100720065002000450078007000 ...data truncated to first 64 chars
    Insert
            Type:INTEGER:2
            Text:CHARACTER:819

我的 esql 代码片段:

SET OutputRoot.HTTPRequestHeader."Content-Type" = 'application/octet-stream';
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = rInputDocData.*:DocumentName;
--Setting the content
SET OutputRoot.BLOB.BLOB = BASE64DECODE(rInputDocAttachment.*:AttachmentData64Binary);

特殊字符出现在字段 rInputDocData.*:DocumentName 中。其中一些值是:

Printing….PDF
Mark’s Agreement .pdf

注意上面两个值中的 … 和 ’ 不被识别为 UTF-8 的一部分。

有没有办法在 ESQL 中将这些值转换为 ISO 8859-1,因为在 Notepad++ 中执行相同的转换会导致这些值被接受?

我已经尝试了以下步骤,但 none 成功了,但我仍然遇到同样的错误:

  1. 将 OutputRoot.Properties.CodedCharSetId 设置为 1208,将 OutputRoot.Properties.Encoding 设置为 546,就像在输入中收到请求时的属性一样。

  2. 设置 OutputRoot.Properties.CodedCharSetId 为 819。

  3. 将内容类型 HTTPRequestHeader 设置为 'application/octet-stream; charset=utf-8'。

  4. 将内容类型 HTTPRequestHeader 设置为 'application/octet-stream; charset=iso-8859-1'。

  5. 通过以下方式转换 HTTPRequestHeader 'X-IntegrationServer-Resource-Name':

    1. SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 1208 ENCODING 546);
    2. SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 819);
    3. SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 1208 ENCODING 546) AS CHARACTER CCSID 819);

源供应商拒绝 handle/convert 特殊字符,因此我们需要在 ACE 中处理此问题。任何帮助将不胜感激。

HTTP headers 应该只使用 US-ASCII 范围内的字符。其他一些字符 可能 是可以容忍的,但是网络服务器实现在这方面并不一致。

有关详细信息,请参阅此处的讨论:what characters are allowed in HTTP header values? 该对话的参与者之一是 HTTP/1.1 规范的作者,因此我认为我们可以依赖他的意见。

回复:

Notice the … and ’ in the above two values which are not recognized as part of UTF-8.

UTF-8 可以表示任何 Unicode 字符,因此该声明不可能是真的。仔细看报错,引用的CCSID是819,也就是IBM CCSID for ISO-8859-1。

似乎 ... 字符不在 CCSID 819 字符集中。它在 Latin 1 的 Windows 版本中,CCSID 1252,但正如前面的回答所说,它可能不适用于目标 Web 服务器。

您可以尝试这些,但不确定是否有效:

SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(ASBITSTREAM(rInputDocData.*:DocumentName CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 819);

SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(ASBITSTREAM(rInputDocData.*:DocumentName CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 1252);

以下对我有用,但正如最上面的评论所指出的那样,它确实因目标服务器中的编码错误而继续失败:

SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(CAST(rInputDocData.*:DocumentName AS BLOB CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 819);