从Web服务响应中获取长整数是不可能的

时间:2015-03-02 12:19:49

标签: php soap long-integer

我使用SoapClient类进行SOAP交互。当SOAP响应包含长整数时,PHP会将其转换为科学计数法。我怎样才能获得这样的值并在以后的SOAP请求中使用它?

我无法使用gmp,在我可以访问之前,该值会被转换为浮动状态。 gmp_init(): Unable to convert variable to GMP - wrong type

另见:http://arstechnica.com/civis/viewtopic.php?t=100615

$wsld = 'http://example.com?wsdl';
$soap = new \SoapClient($wsld);
$result=$soap->foo();
echo $result->return->id; // echo 1.1122233344456E+14 instead of 111222333444555;

1 个答案:

答案 0 :(得分:2)

也许您可以制作WSDL的本地副本,并将遇到问题的字段的数据类型更改为字符串。

缺点是您必须跟踪对XML的更改,但这是阻力最小的路径,可以为您提供更直接的解决方案。

作为替代方案,在某种程度上更加健壮,查看SoapClient documentation可以使用 typemap 选项。

  

typemap选项是一个类型映射数组。类型映射是一个数组,其键为type_name,type_ns(名称空间URI),from_xml(回调接受一个字符串参数)和to_xml(回调接受一个对象参数)。

也许这个other answer可能会帮助您使用 typemap 。在不了解您的架构的情况下,很难为您提供源代码,但该示例可能适用于您。

以下是上述答案中发布的源代码的逐字副本:

function to_long_xml($longVal) {
  return '<long>' . $longVal . '</long>';
}
function from_long_xml($xmlFragmentString) {
  return (string)strip_tags($xmlFragmentString);
}
$client = new SoapClient('http://acme.com/products.wsdl', array(
  'typemap' => array(
    array(
      'type_ns' => 'http://www.w3.org/2001/XMLSchema',
      'type_name' => 'long',
      'to_xml' => 'to_long_xml',
      'from_xml' => 'from_long_xml',
    ),
  ),
));