PHP SOAP / Понимание WSDL - PullRequest
       22

PHP SOAP / Понимание WSDL

1 голос
/ 27 июля 2010

Разобрался, см. Обновление ниже.

Я пытаюсь работать с определенным веб-сервисом через PHP (пробовал как собственный, так и клиент Zend SOAP), и он только возвращаетсостояние ошибки.

Я подозреваю, что это как-то связано с несколькими компонентами в вызове метода retrieveMemberInfo (authBean, memberInfoBean).

Может кто-нибудь взглянуть на WSDL и указать мнев правильном направлении для этого конкретного вызова метода через клиент PHP?

Вот что у меня есть:

$service = new SoapClient('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');
$result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstname', 'lastname'));
var_dump($result);

Обновление

Проблема была не в вызове WSDL, как первоначально предполагалось.Это был формат параметров, используемых при вызове метода retrieveMemberInfo.Вот полное решение, которое правильно возвращает ответ SOAP:

$params->authBean->loginId = 'username';
$params->authBean->orgName = 'orgName';
$params->authBean->password = 'password';
$params->memberInfoBean->firstName = 'firstName';
$params->memberInfoBean->lastName = 'lastName';

$service = new SoapClient('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');
$result = $service->retrieveMemberInfo($params);

var_dump($result);

Теперь мне просто нужно выяснить, как разобрать возвращенный stdObject.

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 27 июля 2010

Это явно ошибка в PHP. Файл не полностью прочитан. В самом WSDL нет ничего плохого.

Ошибка синтаксического анализа XML:

object(LibXMLError)#1 (6) {
  ["level"]=>
  int(3)
  ["code"]=>
  int(5)
  ["column"]=>
  int(5)
  ["message"]=>
  string(41) "Extra content at the end of the document
"
  ["file"]=>
  string(56) "https://qa.everbridge.net/ws3/services/WebServices3?wsdl"
  ["line"]=>
  int(537)
}

Строка 537 находится перед концом файла.

Предлагаю сообщить об этом http://bugs.php.net/

0 голосов
/ 27 июля 2010

Я попытался скопировать его локально и использовать пример, приведенный в сообщении об ошибке PHP.

$tmpWsdlPath = tempnam(sys_get_temp_dir(), 'wsdl');
copy("https://qa.everbridge.net/ws3/services/WebServices3?wsdl", $tmpWsdlPath);
$service = new SoapClient($tmpWsdlPath);
$result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstName', 'lastName'));

Он правильно захватывает файл WSDL и записывает его во временную папку.Это весь файл.

Он по-прежнему возвращает статус ошибки.

0 голосов
/ 27 июля 2010

Кажется, проблема возникла до вызова этого метода:

Неустранимая ошибка: Uncaught Исключение SoapFault: [WSDL] SOAP-ERROR: Синтаксический анализ WSDL: Не удалось загрузить из 'https://qa.everbridge.net/ws3/services/WebServices3?wsdl': Дополнительное содержимое в конце документа в /.../wsdl.php:2 Трассировка стека: # 0 /.../wsdl.php(2): SoapClient-> SoapClient ('https://qa.ever...')# 1 {main} добавляется в /.../wsdl.php в строке 2

<code><?php
$service = new SoapClient('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');
//$result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstname', 'lastname'));

echo '<pre>';
var_dump($result);
echo '
';?>

Я получил этот URL с помощью wget, и я не сделалНичего лишнего не вижу в конце возвращенного документа. Не то чтобы я много знал о WSDL, но я бы отследил причину этой ошибки.

Обновление:

После подтверждения результатов Artefacto я решил попробовать обходной путь:

<code>$curl = curl_init('https://qa.everbridge.net/ws3/services/WebServices3?wsdl');    
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);

$wsdl_string = curl_exec($curl);

file_put_contents('/var/tmp/wsdl.xml',$wsdl_string);

try
{
    $service = new SoapClient('/var/tmp/wsdl.xml');
    $result = $service->retrieveMemberInfo(array('loginId', 'orgName', 'password'), array('firstname', 'lastname'));

    print '<pre>';
    var_dump($result);
    print '
';} catch (Exception $ e) {print'
';
    var_dump(libxml_get_last_error());
    print '
';}

Конечно,удалите код отладки. Вы также можете удалить временный файл после его использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...