【问题标题】:How to fix broken XML generated by SOAP::Lite如何修复 SOAP::Lite 生成的损坏的 XML
【发布时间】:2019-08-20 16:07:33
【问题描述】:

目前我正在使用某些基于 SOAP 的 Web 服务;我想使用 SOAP::Lite 与这些服务进行通信。

在第一次测试中,一切正常;直到我的数据中有一个 & 符号 (&)。

执行请求时,我使用以下 sn-p 执行此操作:

my $or_client = SOAP::Lite->new(
    proxy => '...',
    readable => 1,
    autotype => 0,
);
my $or_response = $or_client->call(
    'aMethod',
    SOAP::Data->name('company_name')->value('ACME'),
    ...
);

当我启用跟踪(添加行SOAP::Lite->import(trace => 'debug');)时,我可以看到以下数据发送到服务器:

<soap:Envelope 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
...>
    <soap:Body>
        <ns:aMethod>
            <company_name>ACME</company_name>
            ...
        </ns:aMethod>
    </soap:Body>
</soap:Envelope>

这没有任何问题。但是当我的数据对象的值包含特殊字符时:

SOAP::Data->name("company_name")->value("ACME & Co.")

然后我收到 500 Internal Server 错误;带有错误字符串“意外字符''(代码32)(缺少名称?)...”

我检查了发送到 SOAP 服务的 XML,发现我在“ACME & Co”中的“&”不是以正确的方式转义的 XML:

<company_name>ACME & Co.</company_name>

有什么特殊的选项我必须打开吗?还是我必须在将其设置为value 之前为自己进行 XML 转义?

【问题讨论】:

    标签: perl soap


    【解决方案1】:

    有什么特殊的选项我必须打开吗?还是我必须在将其设置为值之前为自己进行 XML 转义?

    你可以这样做:

    SOAP::Data->name("company_name")->value(SOAP::Utils::encode_data("ACME & Co."))
    

    证明:

      DB<3> $m = SOAP::Data->name("company_name")->value(SOAP::Utils::encode_data("ACME & Co."));
    
      DB<6> use Data::Dumper
    
      DB<7> print Dumper $m
    $VAR1 = bless( {
                     '_value' => [
                                   'ACME &amp; Co.'
                                 ],
                     '_attr' => {},
                     '_name' => 'company_name',
                     '_signature' => []
                   }, 'SOAP::Data' );
    

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 2016-02-26
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      相关资源
      最近更新 更多