Чтение длинных значений из веб-сервиса с использованием SoapClient - PullRequest
1 голос
/ 27 мая 2011

Я пишу потребитель мыла на PHP для ws, написанного на Java (Jax ws). Веб-служба экспортирует функцию listRooms () , которая возвращает массив комплексного типа данных Room , который содержит идентификатор (длиной 64 бита) и описание (строку). Теперь, когда я использую веб-сервис с помощью SoapClient, идентификатор преобразуется в число с плавающей точкой (так как в PHP нет 64-битных целых чисел), и я хочу избежать этого. Поскольку для использования других веб-сервисов мне потребуется идентификатор комнаты, я бы предпочел избегать этого неявного преобразования в float, сохраняя его в виде строки.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

9 голосов
/ 27 мая 2011

Это может помочь:

Длинные переполнения, потому что 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',
    ),
  ),
));

Также проверьте, чтобы точно узнать, что вы получите от вызова SOAP, согласно инструкции добавьте 'trace' и используйте getLastRequest :

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
?>
0 голосов
/ 17 февраля 2012

Другой способ сделать это - просто использовать функцию float() перед отправкой данных длинного типа.

В приведенном ниже примере я использую объект stdclass для отправки в качестве параметра:

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