gal*_*hen 8 php base64 encoding soap wsdl
我在PHP中有一个SOAP客户端,它调用WSDL服务.其中一个函数返回base64binary数据.我一直试图解码它没有任何运气.
base64_decode($ encoded_base64data)将无效.我尝试使用带有各种参数的base_convert()和mv_convert_encoding(),但无法获得正确的结果.
编码结果数据以:
??`I?%&/m?{J?J??t??`$?@???????iG#)?*??eVe]f@????{????{????;?N'????\fdl??J??!????~|?"
Run Code Online (Sandbox Code Playgroud)
(数据更长,这只是字符串的一小部分)
知道如何做到这一点?
谢谢
编辑
我使用新的__doRequest()方法扩展了SoapClient,以检查接收到的数据是否是正确的base64字符串.我得到了一个合适的base64编码字符串,上面显示的结果是解码后的响应.
无论如何,字符串由SoapClient自动从base64解码为二进制(如@hakre建议的那样),所以我只需要处理二进制响应.
现在我需要的是将二进制字符串解码成看似可读的格式.最终的回复应该包含格鲁吉亚的输出,所以我试图找出原始的编码(但这是一个不同的问题).
hak*_*kre 11
来自base64Binary(XML Schema Part 2:Datatypes 3.2.16):
[定义:] base64Binary代表Base64编码的任意二进制数据.的值空间的base64Binary的是一组二进制八位位组的有限长度的序列.对于base64Binary数据,使用[RFC 2045]第6.8节中定义的Base64 Content-Transfer-Encoding对整个二进制流进行编码.
然后你评论:
当WSDL有xsd:base64binary时,我应该得到base64响应或二进制响应或base64编码的字符串?
你应该得到一个base64编码的字符串.base64编码的字符串表示二进制数据.如果你知道XML规范,这可能更明显,因为你不能用XML传递二进制信息,你只能传递适合XML的字符范围的信息.并且该范围排除了作为二进制数据一部分的字符,尤其是控制字符,如果将二进制八位字节分成较低和较高的字节,则排除较高的窗格.参见字符(可扩展标记语言(XML)1.0(第五版)2.2),其中显示XML是关于字符而不是二进制数据.并且还显示了这些字符形成的二进制数据(以及它们不能形成的那些).
因此,base64Binary编码已被定义为在XML文档中传输二进制数据的一种方法.那么你在SOAP请求的原始XML响应中所拥有的内容绝不是二进制的,而是base64编码的二进制数据.
请注意,您的SOAP客户端可能已经处理了此编码并提供了已解码的数据.
虽然以前的答案是绝对正确的,但我觉得这可能有助于快速解决问题.
当我们检查响应xml然后我们看到base64编码数据,我们尝试在我们的代码中解码它以获得真实数据但不是必需的.
删除base64_decode
.
因为SOAP客户端在内部解码自身.