Intereting Posts
Как получить ссылку для запуска скрипта Php? zend framework 2 composer.php Проверка формы PHP перед отправкой с использованием отдельных файлов html и php Добавить контроллер 'prefix' для URL-адреса в CodeIgniter Почему я получаю эту внутреннюю ошибку сервера в Laravel Framework? Может ли закрытие браузера завершать PHP-скрипт на сервере? Красноречивое соединение / отсоединение / синхронизация срабатывает в любом случае? Публикация изображения base64 на php-сервер в android Самый чистый способ читать настройки конфигурации из файла PHP и загружать весь код проекта с помощью сценария оболочки Предупреждение: mysqli_query () ожидает, что параметр 1 будет mysqli, строка, указанная в Получение значения кнопки отправки в Laravel 5.3 как отправить push-уведомление с помощью phonegap и parse Двойной символ подчеркивания в PHP? Преобразование совпадений регулярного выражения в многомерный массив Новичок имеет проблемы с загрузкой файла с помощью ASIHTTPRequest

SOAP PHP разбор ошибок WSDL: не удалось загрузить внешний объект?

Я пытаюсь запустить веб-сервис с помощью PHP и SOAP, но все, что я до сих пор понимаю, это:

(SoapFault) [2], в котором говорится: «SOAP-ERROR: анализ WSDL: не удалось загрузить из« http: //localhost/MyRegistration/login.xml »: не удалось загрузить внешний объект« http: // localhost / MyRegistration /login.xml "

Я попытался изменить localhost на 127.0.0.1, но это не имеет никакого значения. логин на самом деле является файлом wsdl, но если я положу login.wsdl в конструкторе SOAPClient, он говорит, что вместо этого «похоже, что у нас нет XML-документа» ».

Вот мой код для SOAP Client (register_client.php):

<?php try { $sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl'); $param1 = $_POST["regname"]; $param2 = $_POST["regpass1"]; $response = $sClient->loginVerify($param1, $param2); var_dump($response); } catch(SoapFault $e) { var_dump($e); } ?> 

И вот файл login.wsdl:

 <?xml version="1.0"?> <definitions name="LoginVal" targetNamespace="urn:LoginVal" xmlns:tns="urn:LoginVal" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Login"> <xsd:element name="getName" type="xsd:string" /> <xsd:element name="getPass" type="xsd:string" /> <xsd:element name="LoginResponse" type="xsd:string" /> </xsd:schema> </types> <message name="loginVerify"> <part name="username" type="tns:getName" /> <part name="password" type="tns:getPass" /> </message> <message name="doLoginResponse"> <part name="return" type="tns:LoginResponse" /> </message> <portType name="LoginPort"> <operation name="loginVerify"> <input message="tns:loginVerify" /> <output message="tns:doLoginResponse" /> </operation> </portType> <binding name="LoginBinding" type="tns:LoginPort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="loginVerify"> <soap:operation soapAction="urn:LoginAction" /> <input> <soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding> <service name="LoginService"> <port name="LoginPort" binding="tns:LoginBinding"> <soap:address location="http://localhost/MyRegistration/register.php" /> </port> </service> </definitions> пространство <?xml version="1.0"?> <definitions name="LoginVal" targetNamespace="urn:LoginVal" xmlns:tns="urn:LoginVal" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Login"> <xsd:element name="getName" type="xsd:string" /> <xsd:element name="getPass" type="xsd:string" /> <xsd:element name="LoginResponse" type="xsd:string" /> </xsd:schema> </types> <message name="loginVerify"> <part name="username" type="tns:getName" /> <part name="password" type="tns:getPass" /> </message> <message name="doLoginResponse"> <part name="return" type="tns:LoginResponse" /> </message> <portType name="LoginPort"> <operation name="loginVerify"> <input message="tns:loginVerify" /> <output message="tns:doLoginResponse" /> </operation> </portType> <binding name="LoginBinding" type="tns:LoginPort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="loginVerify"> <soap:operation soapAction="urn:LoginAction" /> <input> <soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding> <service name="LoginService"> <port name="LoginPort" binding="tns:LoginBinding"> <soap:address location="http://localhost/MyRegistration/register.php" /> </port> </service> </definitions> 

И я не уверен, что это связано, поэтому я предоставляю код для SOAP Server register.php:

 <?php if(!extension_loaded("soap")) { dl("php_soap.dll"); } ini_set("soap.wsdl_cache_enabled", "0"); $server = new SoapServer("login.wsdl", array('uri'=>'http://127.0.0.1/MyRegistration')) public function loginVerify($username, $password) { if($_POST["regname"] && $_POST["regemail"] && $_POST["regpass1"] && $_POST["regpass2"] ) { if($_POST["regpass1"] == $_POST["regpass2"]) { $servername = "localhost"; $username = "root"; $password = "Hellfire"; $conn = mysql_connect($servername,$username,"Hellfire")or die(mysql_error()); mysql_select_db("soap",$conn); $sql = "insert into users (name,email,password)values('$_POST[regname]','$_POST[regemail]','$_POST[regpass1]')"; $result = mysql_query($sql,$conn) or die(mysql_error()); return "You have registered sucessfully"; //print "<a href='index.php'>go to login page</a>"; } else return "passwords dont match"; } else return "invalid data"; } $server->AddFunction("loginVerify"); $server->handle(); ?> 

Извините, если я даю ненужную информацию, но я полный новичок в этом, и я был бы очень признателен, если бы кто-нибудь мог указать, почему именно эта ошибка SOAP возникает, и что я могу сделать, чтобы исправить Это.

Я использую WAMP Server версии 2.2, с mySQL 5.5.24 и PHP 5.3.13

После перехода на PHP 5.6.5 мыло 1.2 больше не работало. Поэтому я решил проблему, добавив дополнительные параметры SSL.

Моя ошибка:

не удалось загрузить внешний объект

Как решить:

 // options for ssl in php 5.6.5 $opts = array( 'ssl' => array( 'ciphers' => 'RC4-SHA', 'verify_peer' => false, 'verify_peer_name' => false ) ); // SOAP 1.2 client $params = array( 'encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_2, 'trace' => 1, 'exceptions' => 1, 'connection_timeout' => 180, 'stream_context' => stream_context_create($opts) ); $wsdlUrl = $url . '?WSDL'; $oSoapClient = new SoapClient($wsdlUrl, $params); 

Поместите этот код над любым вызовом Soap:

 libxml_disable_entity_loader(false); 

На register_client.php убедитесь, что URL, который был передан SoapClient, доступен с компьютера, на котором выполняется код.

 $sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl'); 

Если 127.0.0.0 не работает, вы можете попробовать использовать какой-либо сетевой IP-адрес и посмотреть.

Дайте мне знать, если он по-прежнему не исправит это для вас, я попытался с вашим примером и сменой пути (что делает его правильным в моей среде разработчиков) исправил для меня ту же ошибку.

Мне было бы интересно узнать, не исправляет ли это это для вас.

У меня такая же проблема.

Эта настройка php решила мою проблему:

 allow_url_fopen -> 1 

Если у кого-то есть одна и та же проблема, одним из возможных решений является установка параметра конфигурации контекста контекста (при условии, что вы подключаетесь от 11.22.33.44 до 55.66.77.88):

 $context = [ 'socket' => [ 'bindto' => '55.66.77.88' ] ]; $options = [ 'soapVersion' => SOAP_1_1, 'stream_context' => stream_context_create($context) ]; $client = new Client('11.22.33.44', $options);