Я пытаюсь запустить веб-сервис с помощью 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);