2012-10-13 8 views
13

Ich versuche, einen Web-Service mit PHP & SOAP zu laufen, aber alles, was ich dies so weit ist immer:SOAP PHP Fehler beim Parsing von WSDL: Externe Einheit konnte nicht geladen werden?

(SoapFault)[2] message which states: 'SOAP-ERROR: Parsing WSDL: Couldn't load from ' http://localhost/MyRegistration/login.xml ' : failed to load external entity " http://localhost/MyRegistration/login.xml "

Ich habe versucht localhost 127.0.0.1 ändern, aber das macht keinen Unterschied . login ist eigentlich eine wsdl-Datei, aber wenn ich login.wsdl in den SOAPClient-Konstruktor lege, sagt es stattdessen "'sieht so aus, als hätten wir kein XML-Dokument'".

Hier ist mein Code für den 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); 
} 
?> 

Und hier ist die login.wsdl Datei:

<?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> 

Und ich bin nicht sicher, ob dies ich bin die Bereitstellung der Code für den SOAP-Server register.php beteiligt, so:

<?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(); 
?> 

es tut mir leid, wenn ich unnötig informati geben werde weiter, aber ich bin ein absoluter Neuling dabei - und ich würde es wirklich schätzen, wenn jemand darauf hinweisen könnte, warum genau dieser SOAP-Fehler erzeugt wird und was ich tun kann, um es zu korrigieren.

Ich benutze WAMP Server Version 2.2, mit mySQL 5.5.24 und PHP 5.3.13

Antwort

3

Auf register_client.php sicher, dass die URL, die Soapclient übergeben wurde von der Maschine zugänglich ist Sie ausführen der Code.

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

Wenn 127.0.0.0 nicht funktioniert, können Sie versuchen, einige Netzwerk-IP-Adresse zu verwenden und zu sehen.

Lassen Sie mich wissen, wenn es immer noch nicht für Sie beheben, habe ich mit Ihrem Beispiel versuchen und ändern Pfad (so dass es in meiner Entwicklerumgebung richtig) hat für mich denselben Fehler behoben.

Ich wäre interessiert zu wissen, ob es nicht für Sie repariert.

1

Ich hatte das gleiche Problem.

Diese PHP-Einstellung mein Problem gelöst:

allow_url_fopen -> 1 
19

Nach PHP 5.6.5 migrieren, die Seife 1.2 funktionierte nicht mehr. Also habe ich das Problem gelöst, indem ich optionale SSL-Parameter hinzugefügt habe.

Mein Fehler:

failed to load external entity

Wie lösen:

// 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); 
+1

einfach auf die Antwort hinzuzufügen, wird dies durch Änderungen in OpenSSL in 5.6.x http://php.net/manual/en/migration56.openssl.php –

+4

Statt Deaktivierung von SSL Peer motiviert Verifizierung sollten Sie versuchen, zu beheben, was die Validierung fehlschlägt. Zum Beispiel, indem Sie explizit den Pfad zu einem Cafile setzen, der die notwendigen Root-Zertifikate enthält, gegen die verifiziert werden kann. Die Antwort kommt jedoch zum Kern des Problems, und manchmal ist dies möglicherweise die einzige verfügbare Lösung, also +1. – deceze

+1

Wie "openssl.cafile = C: /path/to/sslCertificates/cacert.pem" zu php.ini hinzufügen :-) (wie curl.cainfo!) –

5

diesen Code über jede Soap Anruf Put:

libxml_disable_entity_loader(false); 
0

Wenn jemand das gleiche Problem hat, ist eine mögliche Lösung Legen Sie den Stream - Konfigurationsparameter bindto fest (vorausgesetzt, Sie stellen eine Verbindung von 11.22.33.44 zu 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); 
1

versuchen Sie dies.funktioniert bei mir

$options = array(
    'cache_wsdl' => 0, 
    'trace' => 1, 
    'stream_context' => stream_context_create(array(
      'ssl' => array(
       'verify_peer' => false, 
       'verify_peer_name' => false, 
       'allow_self_signed' => true 
     ) 
    )) 

$client = new SoapClient(url, $options); 
Verwandte Themen