2013-05-29 5 views
10

Ich versuche, einen Web Service auf einem SAP-PI-System zu implementieren. Die WSDL Ich habe sieht wie folgt aus:PHP SoapClient: Unbekannt erforderlich WSDL-Erweiterung

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions name="request_SO" targetNamespace="http://company.ch/orstest/jason_test" xmlns:p1="http://company.ch/orstest/jason_test" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:documentation/> 
    <wsp:UsingPolicy wsdl:required="true"/> 
    <wsp:Policy wsu:Id="OP_request_SO"/> 
    <wsdl:types> 
     <xsd:schema targetNamespace="http://company.ch/orstest/jason_test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://company.ch/orstest/jason_test"> 
      <xsd:element name="request" type="request"/> 
      <xsd:element name="response" type="response"/> 
      <xsd:complexType name="request"> 
       <xsd:annotation> 
        <xsd:appinfo source="http://sap.com/xi/VersionID">a8b7948ac2e211e2b2380000001f0d6a</xsd:appinfo> 
       </xsd:annotation> 
       <xsd:sequence> 
        <xsd:element name="body" type="xsd:string"/> 
       </xsd:sequence> 
      </xsd:complexType> 
      <xsd:complexType name="response"> 
       <xsd:annotation> 
        <xsd:appinfo source="http://sap.com/xi/VersionID">bf49af09c36c11e299790000001f0d6a</xsd:appinfo> 
       </xsd:annotation> 
       <xsd:sequence> 
        <xsd:element name="body" type="xsd:string"/> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="request"> 
     <wsdl:documentation/> 
     <wsdl:part name="request" element="p1:request"/> 
    </wsdl:message> 
    <wsdl:message name="response"> 
     <wsdl:documentation/> 
     <wsdl:part name="response" element="p1:response"/> 
    </wsdl:message> 
    <wsdl:portType name="request_SO"> 
     <wsdl:documentation/> 
     <wsdl:operation name="request_SO"> 
      <wsdl:documentation/> 
      <wsp:Policy> 
       <wsp:PolicyReference URI="#OP_request_SO"/> 
      </wsp:Policy> 
      <wsdl:input message="p1:request"/> 
      <wsdl:output message="p1:response"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="request_SOBinding" type="p1:request_SO"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
     <wsdl:operation name="request_SO"> 
      <soap:operation soapAction="http://sap.com/xi/WebService/soap1.1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
      <wsdl:input> 
       <soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="request_SOService"> 
     <wsdl:port name="HTTP_Port" binding="p1:request_SOBinding"> 
      <soap:address location="http://qa1100ap601.company.car.web:50000/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=BS_ORS&amp;receiverParty=&amp;receiverService=&amp;interface=request_SO&amp;interfaceNamespace=http://company.ch/orstest/jason_test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
     </wsdl:port> 
     <wsdl:port name="HTTPS_Port" binding="p1:request_SOBinding"> 
      <soap:address location="https://qas.soa.subcompany.company.ch/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=BS_ORS&amp;receiverParty=&amp;receiverService=&amp;interface=request_SO&amp;interfaceNamespace=http://company.ch/orstest/jason_test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Meine PHP-Datei wie diese (nichts mehr drin derzeit) aussieht:

<?php 
$client = new SoapClient('test.wsdl'); 
?> 

Wenn ich mein Skript renne, ich die folgende Fehlermeldung erhalten geworfen :

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Unknown required WSDL extension 'http://schemas.xmlsoap.org/ws/2004/09/policy' in /srv/www/htdocs/wsdl.php:2 Stack trace: #0 /srv/www/htdocs/wsdl.php(2): SoapClient->SoapClient('test.wsdl') #1 {main} thrown in /srv/www/htdocs/wsdl.php on line 2 

ich habe versucht, die Suche nach dem Fehler auf google und Stackoverflow, und überprüft auch die Kommentare auf php.net, aber ich kann nicht scheinen, um herauszufinden, was ich ändern, um müssten diese zu erhalten Dienst läuft. Ich habe auch versucht, die WSDL-Erweiterung URL zu öffnen, scheint es zu existieren.

Kann mir jemand einen Knochen hier werfen? Ich habe versucht, die Erweiterung URL zu entfernen, dass die Ergebnisse in der folgenden Fehler:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Unexpected WSDL element <UsingPolicy> in /srv/www/htdocs/wsdl.php:2 Stack trace: #0 /srv/www/htdocs/wsdl.php(2): SoapClient->SoapClient('test.wsdl') #1 {main} thrown in /srv/www/htdocs/wsdl.php on line 2 

Antwort

16

Die einzige Lösung, die ich mir vorstellen kann an dieser Stelle ist Ihr UsingPolicy Tag zu aktualisieren:

Ändern Sie den Tag:

<wsp:UsingPolicy wsdl:required="true"/> 

dazu:

<wsp:UsingPolicy wsdl:required="false"/> 
+2

Hey toll, der Fehler ist jetzt weg :) Jetzt kann ich den Service ausprobieren :) – Ahatius

+0

Awesome! Froh zu helfen. –

14

das ist nicht wirklich die richtige Antwort in einer SAP-Umgebung. In Ihrer URL für die WSDL sehen Sie /ws_policy/ - ändern Sie dies in /standard/ und Sie können die PHP-SoapClient-Klasse verwenden, um den Web-Service zu konsumieren, ohne eine lokal modifizierte Kopie der WSDL verwalten zu müssen. Sie können das gleiche auf einem SAP-Blog here (Login wahrscheinlich erforderlich) sehen.

+0

Ich hatte genau dieses Problem mit dem SAP Web Service und Ihre Antwort hat mir den Tag gerettet! – Shmarkus

3

For new versions the URL is not containing anymore the "ws_policy" instead there is a 0 (standard)or 1 (policy)

Example:

....wsdl/flv_10002A111AD1/bndg_url/.... (ws_policy)

....wsdl/flv_10002A101AD1/bndg_url/.... (standard)

Credits Rafa Martinez

+0

Danke für diese großartige Antwort! Du hast mir Stunden gespart! – Sonson123

0

scheint ein Fehler in PHP Soapserver oder eine fehlende Verlängerung Kompatibilität zu sein, und es noch nicht gelöst ist, zumindest in PHP 5.6.31.

Die einzige Lösung konnte ich war finden UsingPolicy-false erforderlich zu setzen, wie in der akzeptierten Antwort vorgeschlagen:

<wsp:UsingPolicy wsdl:required="false" /> 

Aber Kunden den SOAP-Dienst ohne Authentifizierung darauf zugreifen können, was ein ernsthaftes Sicherheitsproblem ist. Also habe ich versucht, manuell zu überprüfen, dass die Sicherheitsdaten vom Client gesendet werden.

$soapEnvelope = new DOMDocument(); 
$soapEnvelope->loadXML(file_get_contents("php://input"), LIBXML_DTDATTR); 
$wsseNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'Security')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing wsse:Security node'); 
} 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'UsernameToken')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing UsernameToken node'); 
} 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'Username')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing Username node'); 
} 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'Password')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing Password node'); 
} 

// SOAPServer handle requests method 
$server->handle(); 

Es ist ein Schmutz Trick, aber es funktioniert.