2012-10-13 9 views
13

Sto cercando di eseguire un servizio Web utilizzando PHP & SOAP, ma tutto quello che sto ottenendo finora è questo:Errore SOAP PHP durante l'analisi di WSDL: impossibile caricare l'entità esterna?

(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 "

Ho provato a cambiare localhost a 127.0.0.1, ma che non fa alcuna differenza . login è in realtà un file wsdl, ma se metto login.wsdl nel costruttore SOAPClient, dice "sembra che non abbiamo il documento XML '".

Ecco il mio codice per il client SOAP (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); 
} 
?> 

E qui è il file 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> 

e non sono sicuro se questo è coinvolti, quindi sto fornendo il codice per il register.php SOAP Server:

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

mi dispiace se sto dando informati inutili on, ma sono un novizio completo a questo - e lo apprezzerei davvero se qualcuno potesse indicare perché esattamente questo Fault Fault viene generato, e cosa posso fare per correggerlo.

Sto usando WAMP Server versione 2.2, con mySQL 5.5.24 e PHP 5.3.13

risposta

3

Su register_client.php fare in modo che l'URL che è stata passata al SoapClient è accessibile dalla macchina che si sta eseguendo il codice.

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

Se 127.0.0.0 non funziona, provare a utilizzare l'indirizzo IP di rete e vedere.

Fammi sapere se non lo aggiusta per te, ho provato con il tuo esempio e cambiando percorso (rendendolo appropriato nel mio ambiente di sviluppo) ha corretto lo stesso errore per me.

Sarei interessato a sapere se non lo aggiusta per voi.

1

Ho avuto lo stesso problema.

Questa impostazione php Ha risolto il problema:

allow_url_fopen -> 1 
19

Dopo la migrazione a PHP 5.6.5, il sapone 1.2 non funziona più. Quindi ho risolto il problema aggiungendo parametri SSL opzionali.

mio errore:

failed to load external entity

Come risolvere:

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

solo per aggiungere alla risposta, questo è motivato da variazioni di OpenSSL in 5.6.x http://php.net/manual/en/migration56.openssl.php –

+4

Invece di disattivazione pari SSL verifica, dovresti tentare di correggere qualunque cosa renda la validazione fallita. Ad esempio, impostando esplicitamente il percorso di un bar che contiene i certificati di root necessari per la verifica. La risposta arriva comunque al nocciolo del problema, ea volte questa potrebbe essere l'unica soluzione disponibile, quindi +1. – deceze

+1

Come aggiungere "openssl.cafile = C: /path/to/sslCertificates/cacert.pem" a php.ini :-) (come curl.cainfo!) –

5

inserire questo codice di sopra di ogni chiamata Soap:

libxml_disable_entity_loader(false); 
0

Se qualcuno ha lo stesso problema, una possibile soluzione è impostare il parametro di configurazione del contesto dello stream bindto (supponendo che ci si stia collegando da 11.22.33.44 a 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

provare questo.funziona per me

$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); 
Problemi correlati