it-swarm.com.de

SOAP PHP Fehler beim Parsen von WSDL: Externe Entität konnte nicht geladen werden?

Ich versuche, einen Web-Service mit PHP & SOAP auszuführen, aber alles, was ich bisher bekomme, ist folgendes:

(SoapFault) [2] -Nachricht: "SOAP-ERROR: WSDL analysieren: Konnte nicht von" http: //localhost/MyRegistration/login.xml "geladen werden: Externe Entität konnte nicht geladen werden" http : //localhost/MyRegistration/login.xml "

Ich habe versucht, localhost auf 127.0.0.1 zu ändern, aber das macht keinen Unterschied. login ist eigentlich eine wsdl-Datei, aber wenn ich login.wsdl in den SOAPClient-Konstruktor setze, wird "stattdessen kein XML-Dokument" angezeigt. 

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>

Ich bin mir nicht sicher, ob es sich um eine Angelegenheit handelt. Ich gebe den Code für den 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();
?>

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

Ich verwende WAMP Server Version 2.2 mit mySQL 5.5.24 und PHP 5.3.13

15
user1743679

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

Mein Fehler:

externe Entität konnte nicht geladen werden

Wie löst man:

// 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);
24

Setzen Sie diesen Code über jedem Soap-Aufruf:

libxml_disable_entity_loader(false);
6
Nguyen Thanh

Stellen Sie in der Datei register_client.php sicher, dass auf die URL, die an SoapClient übergeben wurde, von dem Computer aus zugegriffen werden kann, auf dem Sie den Code ausführen.

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

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

Lassen Sie mich wissen, wenn es immer noch nicht für Sie behoben ist. Ich habe es mit Ihrem Beispiel versucht und den Pfad zu ändern (indem Sie es in meiner Entwicklungsumgebung richtig machen), hat derselbe Fehler für mich behoben.

Ich würde gerne wissen, ob es für Sie nicht repariert wird.

3
deej

Ich hatte das gleiche Problem.

Diese PHP-Einstellung hat mein Problem gelöst: 

allow_url_fopen -> 1
2
hazard16

versuche 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);
2
gogagubi

Eine ähnliche Antwort wurde mit der https WSDL-URL mit php soapClient erhalten

SoapFault-Ausnahme: [WSDL] SOAP-ERROR: Parsing von WSDL: Konnte nicht geladen werden von ...

Nachdem der Server von PHP 5.5.9-1ubuntu4.21 >> PHP 5.5.9-1ubuntu4.23 aktualisiert wurde, ist bei meinem Client-Computer osx 10.12.6/PHP 5.6 ein Fehler aufgetreten .30, aber MS Web Services Clients-Verbindungen konnten ohne Probleme hergestellt werden.

Server_access.log von Apache2 zeigte keinen Eintrag, als ich versuchte, WSDL zu laden. Daher fügte ich 'cache_wsdl' => WSDL_CACHE_NONE hinzu, um das clientseitige Wsdl-Caching zu verhindern, aber trotzdem keine Einträge erhalten. Schließlich versuchte ich, wsdl per CURL -i überprüfte HEADERS zu laden, aber alles schien in Ordnung zu sein.

Nur libxml_get_last_error() lieferte einen Einblick> SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Also fügte ich meinem Aufruf einige ssl-Optionen hinzu:

$contextOptions = array(
    'ssl' => array(
    'verify_peer' => false,
    'verify_peer_name' => false,
    'allow_self_signed' => true
    ));

$sslContext = stream_context_create($contextOptions);

$params =  array(
    'trace' => 1,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'stream_context' => $sslContext
    );

try {
    $proxy = new SoapClient( $wsdl_url, $params );
} catch (SoapFault $proxy) {
    var_dump(libxml_get_last_error());
    var_dump($proxy);
}

In meinem Fall hat 'allow_self_signed' => true den Trick gemacht!

1
c3labs

Wenn jemand dasselbe Problem hat, können Sie den Konfigurationsparameter bindto stream context festlegen (vorausgesetzt, Sie stellen eine Verbindung von 11.22.33.44 zu 55.66.77.88 her):

$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);
0
Shmarkus

Das Problem könnte darin liegen, dass Sie die openssl-Erweiterung in Ihrer php.ini-Datei nicht aktiviert haben

gehe zu deiner php.ini Datei und entferne ; in der Zeile wo extension=openssl ist

Natürlich gibt es im fraglichen Code einen Teil des Codes, der dafür verantwortlich ist, zu prüfen, ob die Erweiterung geladen ist oder nicht, aber vielleicht vergessen es einige Unvorsichtige

0
Dawid D

Ich benutze selinux und konnte mit dem folgenden Shell-Befehl (als root) PHP= SOAP) aufrufen:

Sudo setsebool -P httpd_can_network_connect on
0
Samo

Hatte gerade ein ähnliches Problem beim Versuch, SoapClient zu verwenden. Alles funktionierte einwandfrei, aber in der Produktion, manchmal bei Seitenaktualisierung, wurde die Fehlermeldung "SoapFault-Ausnahme: [WSDL] SOAP-ERROR: Parsing WSDL: Konnte nicht geladen werden von .." ausgegeben.

Ich habe die params benutzt:

new \SoapClient($WSDL, array('cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true, "exception" => 0)); 

Das Entfernen aller Parameter hat bei mir funktioniert:

new \SoapClient($WSDL); 
0
read