我在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建议的那样),所以我只需要处理二进制响应。
现在我需要的是将二进制字符串解码为看似可读的格式。最终的回复应该包含格鲁吉亚的输出,所以我试图找出原始编码(但这是一个不同的问题)。
答案 0 :(得分:11)
来自 base64Binary (XML Schema Part 2: Datatypes 3.2.16) :
[定义:] base64Binary 表示Base64编码的任意二进制数据。 base64Binary 的value 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客户端可能已经处理此编码并提供已解码的数据。
答案 1 :(得分:8)
虽然之前的回答绝对正确,但我觉得这可能有助于快速解决问题。
当我们检查响应xml然后我们看到base64编码数据,我们尝试在我们的代码中解码它以获取真实数据,但这不是必需的。
删除base64_decode
。
因为SOAP客户端在内部解码。