SOAP Anfrage an Externen Server

Hallo Jungs,

Ich hab IPS bei mir auf der Arbeit vor nem halben Jahr vorgestellt und nun integrieren wir es immer mehr und an mehreren Standorten.
Hilfreich wenn man die Software seit bald 6 Jahren daheim schon nutzt :slight_smile: aber Ok das ist Off-Topic…

Folgendes Problem:
Einer unserer Maschinenhersteller bietet mir Zugriff auf seine Alarmliste via SOAP
Nun möchte ich das Ganze natürlich in IPS haben um dann bei bestimmten Alarmen entsprechend zu reagieren.
Um die korrekte SOAP Anfrage rauszufinden habe ich das Programm SoapUI getestet:
In Soap UI sieht die Raw-Anfrage wie folgt aus:

POST http://192.168.16.189:8081/ISPWebService/IspOrderWs.svc HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8;action="http://wuh-group.com/ISP/IspOrderWs/getAlarms"
Content-Length: 506
Host: 192.168.16.189:8081
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:isp="http://wuh-group.com/ISP/">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>http://wuh-group.com/ISP/IspOrderWs/getAlarms</wsa:Action><wsa:To>http://192.168.16.189:8081/ISPWebService/IspOrderWs.svc</wsa:To></soap:Header>
   <soap:Body>
      <isp:getAlarms>
         <!--Optional:-->
         <isp:machineCode>VAR4</isp:machineCode>
         
      </isp:getAlarms>
   </soap:Body>
</soap:Envelope>

und die Antwort in etwa so:

HTTP/1.1 200 OK
Date: Tue, 16 Jul 2019 13:48:49 GMT
Server: Apache/2.2.21 (Win32) mod_aspdotnet/2.2
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Length: 1368770
Content-Type: application/soap+xml; charset=utf-8
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://wuh-group.com/ISP/IspOrderWs/getAlarmsResponse</a:Action></s:Header><s:Body><getAlarmsResponse xmlns="http://wuh-group.com/ISP/"><getAlarmsResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><StdAlarmResDto><AlarmNo>777</AlarmNo><AlarmText i:nil="true"/><EndTimeIso i:nil="true"/><EndTs>0</EndTs><MachineCode>VAR4</MachineCode><Modul>1</Modul><ModulNo>5</ModulNo><StartTimeIso>2019-06-07T11:00:07</StartTimeIso><StartTs>1559898007</StartTs><TextNo>2157</TextNo><TextRepl1>800</TextRepl1><TextRepl2>0</TextRepl2></StdAlarmResDto><StdAlarmResDto><AlarmNo>787</AlarmNo><AlarmText i:nil="true"/><EndTimeIso i:nil="true"/><EndTs>0</EndTs><MachineCode>VAR4</MachineCode><Modul>1</Modul><ModulNo>17</ModulNo><StartTimeIso>

Meine Frage ist nun wie kann ich diese SoapRequest senden sodass ich auch ne Antwort in IPS bekomme und diese dann auswerten kann? kann mir einer von euch weiterhelfen?

Beste Grüße,
Thomas

Leider hast du im falschen Bereich geschrieben, ich verschiebe das.

Zum Thema:
In PHP gibt es eine fertige SOAP Schnittstelle.
PHP: SoapClient::SoapClient - Manual
Nutze ich z.b. auch intensiv im Fritzbox-Project.
Michael

Hallo Michael,

Danke fürs Verschieben muss mich da verklickt haben :banghead:
Bin schon länger am rumprobieren mit dem von dir verlinkten Inhalt komme aber auf keinen grünen Zweig.
Finde nicht mal einen Ansatz wo und wie meine Daten da reinpassen.:confused:

ein bisschen Weiter bin ich jetzt schon gekommen:

Mit folgendem Code

<?
   // WSDL-URL_Adresse 
   // Kann lokal liegen oder per Endpoint (wie in diesem Beispiel) bezogen werden
   $client = new SoapClient("http://192.168.16.189:8081/ISPWebService/IspOrderWs.svc?wsdl");
    
   // Änderung des Web Service Endpoints 
   $client->__setLocation('http://192.168.16.189:8081/ISPWebService/IspOrderWs.svc');
  
  
	  echo "<h3>Functions</h3>";
$functions = $client->__getFunctions();
foreach($functions as $d){
    echo "</br>".$d;
}
echo "</br><h3>Types</h3>";
$types = $client->__getTypes();
foreach($types as $t)
{
    echo "</br>".$t;
}
?>

bekomme ich folgendes:

 
B]Functions[/b]
getAlarmsResponse getAlarms(getAlarms $parameters)

[b]Types[/b]
struct getAlarms { string machineCode; string startTimeMin; string startTimeMax; boolean openOrClosed; }

jetzt würde ich gerne die Function getAlarms aufrufen und ihr den machineCode „VAR4“ mitgeben.
weiß aber leider nicht wie…

Ich komme einfach nicht weiter… Gibt es denn keinen der hiermit Erfahrung hat und mir ein paar Denkanstöße geben möchte?

Ich habe bisher immer die nicht wsdl Methode benutzt, darum habe ich da auch keine Praktische Erfahrung.
Aber Parameter werden mit new SoapParam erzeugt und können in Funktionen übergeben werden.
PHP: SoapParam::SoapParam - Manual
Eine Funktion kannst du z.b. so aufrufen:

$client->getAlarms(
new SoapParam($machineCode,'machineCode'),
new SoapParam($startTimeMin,'startTimeMin'),
new SoapParam($startTimeMax,'startTimeMax'),
new SoapParam(true,'openOrClosed')
);

Michael