使用SoapClient从webservice读取long值

时间:2011-05-27 10:05:03

标签: php web-services soap jax-ws

我正在用PHP编写一个用SOAP编写的SOAP消费者(Jax ws)。 webservice导出一个函数 listRooms(),它返回一个复杂数据类型 Room 的数组,其中包含一个id(64位长)和一个描述(字符串)。现在每当我使用SoapClient使用web服务时,id都会转换为float(因为PHP中没有64位整数),我想避免它。因为我需要房间id来使用其他Web服务,我宁愿避免这种隐式转换浮动,将其保存在字符串中。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:9)

This might help:

  

长溢出因为ext / soap将它映射到int,而你是32位拱。您可以使用自定义类型映射器来覆盖{http://www.w3.org/2001/XMLSchema} long的内部处理,从而轻松解决该问题:

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',
    ),
  ),
));

根据手册add 'trace' and use getLastRequest,检查您确切从SOAP调用中获得的内容:

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
?>

答案 1 :(得分:0)

其他方法,只是在数据发送为long类型之前使用float()函数。

在下面的示例中,我使用stdclass对象作为参数发送:

<?php
if ($index == "Your_longtype_Field"){
    $a->$index = (float) $value;
} else {
    $a->$index = $value;
}
?>
相关问题