使用SoapClient从webservice读取long值

Jac*_*ack 1 php soap web-services jax-ws

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

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

ʍǝɥ*_*ʇɐɯ 9

这可能有所帮助:

长溢出因为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',
    ),
  ),
));
Run Code Online (Sandbox Code Playgroud)

还要检查您从SOAP调用中获取的确切内容,根据手动添加"trace"并使用getLastRequest:

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