У меня возникли проблемы с вызовом веб-сервиса, который я установил из PHP. http://XXX.XXX.XXX.XXX/test.asmx?wsdl
адрес http://XXX.XXX.XXX.XXX/test.asmx?wsdl
в приведенном ниже сообщении об ошибке возвращает действительный WSDL. Я успешно пытался назвать его веб-сервисом с помощью клиента VB.net, но когда я его вызываю из PHP на Debian, я получаю следующее сообщение:
Неустранимая ошибка: исключение SoapFault: [WSDL] SOAP-ERROR: анализ WSDL: Не удалось загрузить из «http://XXX.XXX.XXX.XXX/test.asmx?wsdl» в /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php:101 Трассировки стека: # 0 /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php(101): SoapClient-> SoapClient ('http://XXX.XXX.XXX.XXX/', Array) # 1 {main} throw в /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php в строке 101
В чем проблема? Я включил свой код для веб-службы и клиента PHP ниже.
Веб-сервис:
Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.ComponentModel ... ' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. ' <System.Web.Script.Services.ScriptService()> _ <System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _ <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <ToolboxItem(False)> _ Public Class WebService1 Inherits System.Web.Services.WebService <WebMethod()> _ Public Function HelloWorld() As String Return "Hello World" End Function End Class
PHP-клиент:
require_once($_SERVER['DOCUMENT_ROOT']."/catalog/fomeus/includes/soap/nusoap.php"); $objClient = new soapclient("http://XXX.XXX.XXX.XXX/test.asmx?wsdl", array('trace' => 1, 'exception' => 0, 'cache_wsdl' => 0)); print_r($objClient -> HelloWorld());
Я использую PHP версии 5.2.6, если это поможет. Я занимаюсь множеством сообщений на разных форумах, пытаясь выяснить, в чем проблема. У многих людей была такая же проблема, но ни одно из решений, которые я нашел до сих пор, не работает для меня. Любая помощь будет принята с благодарностью.
Еще один вариант – cURL. Вы можете создать свою полезную нагрузку в виде строки XML и отправить ее на тот же URL-адрес, используя cURL. Затем вам необходимо будет зафиксировать код ответа и обработать его соответствующим образом. Когда у меня возникли проблемы с SOAPClient, я перешел в cURL – работает как шарм.
Если вы используете nusoap (php 5.2 имеет собственный soapclient, который я предпочитаю), первое, что я вижу, это ваши аргументы. Аргумент №2 для конструктора soapclient nusoap должен быть здесь логическим TRUE, если вы используете WSDL, а не массив. Пытаться:
$objClient = new soapclient("http://XXX.XXX.XXX.XXX/test.asmx?wsdl",true); print_r($objClient->HellowWorld());
Вот как я смог работать с wsdl в прошлом.
Если вы используете собственный клиент и имеете проблемы с wsdl, вы всегда можете обойти его и выполнить прямые вызовы, например:
$objClient = new soapclient(null,array('uri'=>'http://xxx/test.asmx','location'=>'http://xxx/test.asm')); $objClient->__call('HelloWorld',array());
Это должно работать, но не так легко ориентироваться как wsdl.
попробуйте включить php_soap.dll и php_openssl.dll в php.ini. Расположен в папке apache \ apache \ apache2.4.2 \ bin
удалить ";"
Добавление index.php для меня работало в php-приложении
$client = new SoapClient('http://www.domain.com/api/v2_soap/?wsdl'=1) $client = new SoapClient('http://www.domain.com/index.php/api/v2_soap/?wsdl'=1)