LINUX.ORG.RU

PHP WSDL - не могу вызвать функции, хотя вижу их в списке

 , ,


0

1

Здравствуйте. Имеется следующая проблема - подключаюсь к wsdl, но не могу вызывать описанные функции. Т.е. если я вызываю getFunctions , то вижу описание функций, но при попытке вызвать получаю ошибку вида [SoapFault] Not Found (0)

Если попытаться вызвать функцию через __soapCall, то просто возвращает NULL. Пример того, что возвращает getFunctions:

array(6) {
  [0]=>
  string(62) "GetPharmaciesResponse GetPharmacies(GetPharmacies $parameters)"
  [1]=>
  string(62) "GetCategoriesResponse GetCategories(GetCategories $parameters)"
  [2]=>
  string(59) "GetSimptomesResponse GetSimptomes(GetSimptomes $parameters)"
  [3]=>
  string(62) "GetPharmaciesResponse GetPharmacies(GetPharmacies $parameters)"
  [4]=>
  string(62) "GetCategoriesResponse GetCategories(GetCategories $parameters)"
  [5]=>
  string(59) "GetSimptomesResponse GetSimptomes(GetSimptomes $parameters)"
}

вот код, которым вызываю

$options = array(
	'login' => 'somelogin',
	'password' => '123123'
);

$client = new SoapClient(
	"http://example.com:8080/test/ws/directories.1cws?wsdl",
	$options
);

echo "<pre>";
var_dump($client->__getFunctions());//это работает, список см. выше

var_dump($client->__soapCall("GetPharmacies"));//возвращает NULL

var_dump($client->GetPharmacies());//это выдает ошибку

Может кто посоветует куда можно копать?


Я конечно понимаю, что PHP и так позволяет, но может всё-таки передать обязательный аргумент?

sanwashere ★★
()
Ответ на: комментарий от sanwashere

спасибо за ответ. при попытке добавить параметр, например.

var_dump($client->__soapCall("GetPharmacies", array()));

получаю

[SoapFault] 
Not Found (0)
/home/.../.../sync/index.php:19
#0: SoapClient->__doRequest(string, string, string, integer, integer)
	
#1: SoapClient->__soapCall(string, array)
	/home/.../.../sync/index.php:19

если вызывать через методы объекта

var_dump($client->GetPharmacies(array()));
тоже получаю аналогичную ошибку. скорее всего дело не в параметре

gwyllum
() автор топика
Ответ на: комментарий от anonymous

потому, что разработчики сервиса написали, что параметр вообще не нужен. но решил проверить совет sanwashere

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Стоит тогда посмотреть, что там вообще уходит и приходит. Согласно http://php.net/manual/en/soapclient.soapclient.php можно передать в настройках клиента параметр «trace»:

$client = SoapClient(WSDL_URL, array('trace' => true));
и проанализировать результаты методов SoapClient->__getLastRequest, SoapClient->__getLastRequestHeaders, SoapClient->__getLastResponse and SoapClient->__getLastResponseHeaders.

sanwashere ★★
()
Ответ на: комментарий от sanwashere

вот что получилось


$options = array(
		'login' => 'test',
		'password' => '23423423',
		'trace' => true
);

$client = new SoapClient(
		"http://softfarm.by:8080/.../ws/directories.1cws?wsdl",
		$options
);

try {
	$results = $client->GetPharmacies();
}
catch (SoapFault $soapFault) {

	echo "<br>";
	echo "Request :<br>", htmlentities($client->__getLastRequest()), "<br>";
	echo "Request headers: <br>".$client->__getLastRequestHeaders().'<br>';
	echo "Response :<br>", htmlentities($client->__getLastResponse()), "<br>";
	echo "Response headers:<br>".$client->__getLastResponseHeaders().' <br>';
}


результат:
Request :
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="directories"><SOAP-ENV:Body><ns1:GetPharmacies/></SOAP-ENV:Body></SOAP-ENV:Envelope> 
Request headers: 
POST /TestEtalon/ws/directories.1cws HTTP/1.1 Host: softfarm.by Connection: Keep-Alive User-Agent: PHP-SOAP/5.6.23 Content-Type: text/xml; charset=utf-8 SOAPAction: "directories#Directories:GetPharmacies" Content-Length: 213 Authorization: Basic ******************** 
Response :
(ничего не выдает)
Response headers:
HTTP/1.1 404 Not Found Server: nginx/1.6.2 Date: Tue, 07 Aug 2018 09:04:01 GMT Content-Type: text/html Content-Length: 168 Connection: keep-alive 

не совсем врубаюсь насчет 404 ошибки, ведь авторизация проходится и список функций получается.

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

http://softfarm.by/TestEtalon/ws/directories.1cws?wsdl действительно отдаёт 404-ю.
Похоже в WSDL указан кривой адрес сервиса, что бывает.

Попробуйте указать адрес руками:

$client = new SoapClient(WSDL_URL);
$client->__setLocation('http://example.com:8080/test/ws/directories.1cws'); // Или какой там у вас URL сервиса.


И работать с этим.

sanwashere ★★
()
Ответ на: комментарий от sanwashere

Спасибо, Ваш совет помог, теперь 404 ошибка больше не ловится, но функцию вызвать все равно не могу. https://pastebin.com/m7w5DF7m - вывод выложил отдельно, т.к. сообщение получается слишком большим

на всякий, я сделал дамп самой ошибки

object(SoapFault)#119 (10) {
  ["message":protected]=>
  string(13) "Wrong Version"
  ["string":"Exception":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(43) "/home/.../.../sync/index.php"
  ["line":protected]=>
  int(22)
  ["trace":"Exception":private]=>
  array(2) {
    [0]=>
    array(6) {
      ["file"]=>
      string(43) "/home/.../.../sync/index.php"
      ["line"]=>
      int(22)
      ["function"]=>
      string(6) "__call"
      ["class"]=>
      string(10) "SoapClient"
      ["type"]=>
      string(2) "->"
      ["args"]=>
      array(2) {
        [0]=>
        string(13) "GetPharmacies"
        [1]=>
        array(0) {
        }
      }
    }
    [1]=>
    array(6) {
      ["file"]=>
      string(43) "/home/.../.../sync/index.php"
      ["line"]=>
      int(22)
      ["function"]=>
      string(13) "GetPharmacies"
      ["class"]=>
      string(10) "SoapClient"
      ["type"]=>
      string(2) "->"
      ["args"]=>
      array(0) {
      }
    }
  }
  ["previous":"Exception":private]=>
  NULL
  ["faultstring"]=>
  string(13) "Wrong Version"
  ["faultcode"]=>
  string(15) "VersionMismatch"
  ["faultcodens"]=>
  string(39) "http://www.w3.org/2003/05/soap-envelope"
}

меня смутил VersionMismatch

я попробовал сменить версию

$options = array(
		'login' => '...',
		'password' => '...',
		'trace' => true,
		'soap_version'=> SOAP_1_2
);

но ничего не изменилось :(

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

В общем, проблему решил. Я так понимаю, что это особенность кривизны 1с-ки. Может кому пригодится:

1. записываем wsdl в файл на сервере

2. дополнительно указываем параметр location - ссылку без ?wsdl

В итоге должно получится что-то вроде:

$client = new SoapClient(
		$_SERVER['DOCUMENT_ROOT'].'/wsdl.txt',
		[
				'login'         => '...',
				'password'      => '...',
				'soap_version'  => '1.2',
				'location'      => 'http://softfarm.by:8080/TestEtalon/ws/directories.1cws',
				'trace'       => true
		]
);

gwyllum
() автор топика
Последнее исправление: gwyllum (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.