【问题标题】:Soap - base64binary data in PHPSoap - PHP 中的 base64binary 数据
【发布时间】:2013-05-29 10:31:11
【问题描述】:

我有一个用 PHP 编写的 SOAP 客户端,它调用 WSDL 服务。其中一个函数返回 base64binary 数据。我一直在尝试解码它,但没有任何运气。

base64_decode($encoded_base64data) 将不起作用。我尝试使用带有各种参数的 base_convert() 和 mv_convert_encoding(),但无法获得正确的结果。

编码后的结果数据以:

开头
��`I�%&/m�{J�J��t��`$ؐ@�������iG#)�*��eVe]f@�흼��{����{����;�N'���?\fdl��J�ɞ!���?~|?"

(数据要长得多,这只是字符串的一小部分)

知道怎么做吗?

谢谢

编辑

我使用新的 __doRequest() 方法扩展了 SoapClient,以检查接收到的数据是否是正确的 base64 字符串。我得到了一个正确的base64编码字符串,上面显示的结果是解码后的响应。

无论如何,SoapClient 自动将字符串从 base64 解码为二进制(如 @hakre 建议的那样),所以我只需要处理二进制响应。

现在我需要将二进制字符串解码为看起来像可读格式的东西。最终响应应该包含格鲁吉亚语输出,所以我试图找出原始编码(但这是一个不同的问题)。

【问题讨论】:

  • “将不起作用”、“各种参数”和“正确的结果”并没有真正的帮助。显示准确的输入、使用的准确代码、准确的输出和您期望的输出。
  • base64_decode($encoded_base64data) 表示它不会给出正确的字符串(具有预期的编码)。我的所有其他尝试都是如此。 mv_convert_encoding() 的各种参数是“BASE64”和“UTF-8”,base_convert() 的参数是一些整数。这些都没有给我一个很好解码的响应....
  • “使用的确切代码”将是 base64_decode($encoded_base64data)。我认为这个问题已经很清楚了。
  • 不,这个问题绝对不清楚,否则我不会问。 Base64 不是那么先进,base_convert() 很可能不会包含特定于您的情况的错误,因此问题出在您的数据中。如果你不显示你的数据和验证data == base64_decode(base64_encode(data))的方式,这个问题根本无法回答。
  • 您显示的字符串在我看来不像 base64 编码。 Base64 编码的字符串看起来有点像这样:dGhpcyBzdHJpbmcgd2FzIGJhc2U2NCBlbmNvZGVk。它们仅使用 64 个不同的字符(a-zA-Z0-9 和另外两个标准特定字符),有时使用等号 (=) 字符进行填充

标签: php soap encoding wsdl base64


【解决方案1】:

虽然之前的答案是绝对正确的,但我觉得这可能有助于快速解决问题。

当我们检查响应 xml 时,我们会看到 base64 编码数据,我们尝试在代码中对其进行解码以获取真实数据,但这不是必需的。

删除base64_decode

因为 SOAP 客户端会在内部自行解码。

【讨论】:

    【解决方案2】:

    来自base64Binary (XML Schema Part 2: Datatypes 3.2.16)

    [定义:] base64Binary 表示 Base64 编码的任意二进制数据。 base64Binaryvalue space 是二进制八位字节的有限长度序列的集合。对于 base64Binary 数据,整个二进制流使用Section 6.8 of [RFC 2045] 中定义的 Base64 Content-Transfer-Encoding 进行编码。

    然后你评论:

    当 WSDL 具有 xsd:base64binary 时,我应该获得 base64 响应还是二进制响应或 base64 编码字符串?

    你应该得到一个 base64 编码的字符串。该 base64 编码字符串 表示二进制数据。如果您了解 XML 规范,这可能会更明显,因为您不能使用 XML 传递二进制信息,您只能传递适合 XML 字符范围的信息。并且该范围不包括作为二进制数据一部分的字符,尤其是控制字符和更高的窗格,如果您将二进制八位字节划分为较低和较高的一个。请参阅Characters (Extensible Markup Language (XML) 1.0 (Fifth Edition) 2.2),它表明 XML 是关于字符的,而不是二进制数据。它还显示了这些字符确实形成了哪些二进制数据(以及它们不能形成哪些二进制数据)。

    因此,base64Binary 编码已被定义为在 XML 文档中传输二进制数据的一种方式。因此,您在 SOAP 请求的原始 XML 响应中得到的内容绝不是二进制,而是 base64 编码的二进制数据。

    请注意您的 SOAP 客户端可能已经处理了这种编码并提供解码的数据。

    【讨论】:

    • SoapClient 已经按照您的建议自动解码了输出。还没有解决我的问题,但肯定回答了我的问题。谢谢
    • 非常适合指出 SoapClient 自动管理编码。我在做双重编码:/
    • 非常感谢您指出 SOAPClient 自动管理编码。今天你是我的英雄。
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多