Ankündigung

Einklappen
Keine Ankündigung bisher.

Formulierung eines SOAP Requests

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Formulierung eines SOAP Requests

    Hallo zusammen,

    wie formuliere ich diesen SOAP BODY:

    Code:
     <Read xmlns="http://opcfoundation.org/webservices/XMLDA/1.0/">
       <Options ReturnErrorText="true"
                ReturnDiagnosticInfo="true"
                ReturnItemTime="false"
                ReturnItemName="true"
                ReturnItemPath="false"
                ClientRequestHandle="XYZ"
                LocaleID="" />
      <ItemList MaxAge="0">
        <Items MaxAge="0"
           ItemName="CEA709 Port.Datapoints.Raumtemperatur"
           ClientItemHandle="14213232" />
      </ItemList>
    </Read>
    in einem PHP SOAP Call?

    Code:
    $result = $client->__soapCall("Read", ???????
    Bitte um Antwort.
    Vielen Dank im vorraus für jede noch so kleine Hilfe.


  • #2
    Du musst mit soapCall ein (assoziatives) Array übergeben.
    Folglich musst Du Deinen XML-String in ein Array überführen.
    Um auch Attribute mit dem Array zu übergeben, muss man laut den Kommentaren im Manual ein bisschen tricksen: http://php.net/manual/de/soapclient.soapcall.php#90161

    Kommentar


    • #3
      Danke für deine Antwort, da war ich auch schon drüber gestolpert und das hat leider ebenso in einem "Request has timed out" resultiert wie dieser Ansatz:

      Code:
      $result = $client->Read(array(
      	'RequestOptions' => array(	'ReturnErrorText' => true,
      	   					'ReturnDiagnosticInfo' => true,
      	   					'ReturnDiagnosticInfo' => false,
      	   					'ReturnItemName' => true,
      	   					'ReturnItemPath' => false,
      	   					'ClientRequestHandle' => "XYZ",
      	   					'LocaleID' => ""), 
         												
              'ReadRequestItemList' => array(	'ReadRequestItem' => array(	'ItemName' => "CEA709 Port.Datapoints.Raumtemperatur", 'ClientItemHandle' => "14213232"))));
      Geht das in die richtige Richtung?
      Ein SOAP Request kommt nur dann zurück wenn ich exakt die Argumente übergebe die erwartet werden oder?

      Kommentar


      • #4
        Das hängt wohl davon ab wie der SOAP Server konfiguriert ist.
        Ob z.B. eine .wsdl Datei angegeben werden muss, hängt ja auch von der Konfiguration ab.

        Bist Du Dir überhaupt sicher, ob Du eine korrekte Verbindung zu dem Server hergestellt hast?
        Außerdem solltest Du Dich vielleicht mit demjenigen in Verbindung setzen, dessen Schnittstelle (SOAP-Server) Du nutzen willst. Nur der kann Dir sagen welche Parameter erwartet werden.

        Kommentar


        • #5
          Also die Methode GetStatus

          Code:
          <?php
             $client = new SoapClient(null, array('location' => "http://opcfoundation.org/webservices/xmlda/1.0/",
          										 'uri'      => "http://192.168.1.200/DA"));
             
             $client->__setLocation('http://192.168.1.200/DA');
          								   	  
             $result = $client->__soapCall("GetStatus", array('LocaleID' => "", 'ClientRequestHandle' => ""));
             
             var_dump ($result);
          
          ?>
          Läuft einwandfrei bei jeder Anfrage.

          Die Spezifikation für die Read Methode:

          Code:
          <s:element name="Read">
          <s:complexType>
            <s:sequence>
          FOUNDATION
          <s:element minOccurs="0" maxOccurs="1" name="Options" type="s0:RequestOptions" />
          <s:element minOccurs="0" maxOccurs="1" name="ItemList" type="s0:ReadRequestItemList" /> </s:sequence>
          </s:complexType>
          </s:element>
          <s:complexType name="RequestOptions">
          <s:attribute default="true" name="ReturnErrorText" type="s:boolean" /> <s:attribute default="false" name="ReturnDiagnosticInfo" type="s:boolean" /> <s:attribute default="false" name="ReturnItemTime" type="s:boolean" /> <s:attribute default="false" name="ReturnItemPath" type="s:boolean" /> <s:attribute default="false" name="ReturnItemName" type="s:boolean" /> <s:attribute name="RequestDeadline" type="s:dateTime" />
          <s:attribute name="ClientRequestHandle" type="s:string" />
          <s:attribute name="LocaleID" type="s:string" /> </s:complexType>
          <s:complexType name="ReadRequestItemList">
          <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="s0:ReadRequestItem" />
          </s:sequence>
          <s:attribute name="ItemPath" type="s:string" /> <s:attribute name="ReqType" type="s:QName" /> <s:attribute name="MaxAge" type="s:int" />
          </s:complexType>
          <s:complexType name="ReadRequestItem">
          <s:attribute name="ItemPath" type="s:string" /> <s:attribute name="ReqType" type="s:QName" /> <s:attribute name="ItemName" type="s:string" /> <s:attribute name="ClientItemHandle" type="s:string" /> <s:attribute name="MaxAge" type="s:int" />
          </s:complexType>

          und das was ich daraus für PHP abgeleitet habe:

          Code:
          $options = array( 
             					'Options' => array(		'ReturnErrorText' => true, 
             					 						'ReturnDiagnosticInfo' => true, 
             					 						'ReturnDiagnosticInfo' => false, 
             					 						'ReturnItemName' => true,
             					 						'ReturnItemPath' => false
             					 					),
          	   				'ClientRequestHandle' => "XYZ",
          	   				'LocaleID' => ""
          	   			    ); 
          
             $itemList = array(
             					'ItemsList' => array(
             					  					'Items' => array(
          				   					  				    	'MaxAge' => "0",
          						   							    	'ItemName' => "CEA709 Port.Datapoints.Raumtemperatur", 
          						   							    	'ClientItemHandle' => "14213232",
          						   							    ),
          						   				'MaxAge' => "0")
             					);
          
             $result = $client->Read(array($options, $itemList));

          Resultiert leider immer in einem Time Out
          Aus meiner Sicht habe ich das XML nicht ordnungsgemäß in den PHP Call implementiert aber ich weiß nicht was ich falsch mache. :-/

          Kommentar


          • #6
            Das ist ja furchtbar formatiert..

            Ich habe erst einmal mit SOAP gearbeitet, aber ich würde es so probieren:

            PHP-Code:
            $items = array(
                
            'ItemPath' => 'DEF',
                
            'ReqType' => 'IDONTKNOW',
                
            'ItemName' => 'CEA709 Port.Datapoints.Raumtemperatur',
                
            'ClientItemHandle' => '14213232',
                
            'MaxAge' => 100
            );

            $parameter = array(
                
            'Options' => array(
                    
            'ReturnErrorText' => true,
                    
            'ReturnDiagnosticInfo' => true,
                    
            'ReturnItemTime' => false,
                    
            'ReturnItemPath' => false,
                    
            'ReturnItemName' => true,
                    
            'RequestDeadline' => '2013-01-31 15:00:00',
                    
            'ClientRequestHandle' => 'XYZ',
                    
            'LocaleID' => 'ABC'
                
            ),
                
            'ItemList' => array(
                    
            'ItemPath' => 'DEF',
                    
            'ReqType' => 'IDONTKNOW',
                    
            'MaxAge' => 100,
                    
            $items
                
            )
            );

            try
            {
                
            $result $client->__soapCall("Read"$parameter);
                
            var_dump($result);
            }
            catch(
            Exception $e)
            {
                
            var_dump($e);

            Bei ReqType kommt laut Schema ein QName rein. Deswegen weiß ich nicht, was da rein kommt. Du kannst es ja mal testweise entfernen, wenn Du es auch nicht weißt.

            Kommentar


            • #7
              Zum Debuggen kann man den SoapClient auch Erweitern und die __doRequest Methode gezielt anpassen.
              Ich fand das nützlich um
              a) meine Eingabe zu überprüfen.
              b) Auch mal gezielt XML zu übergeben.

              Bsp:
              PHP-Code:
              class TestClient extends SoapClient {
                      public function 
              __doRequest($request$location$action$version$one_way null
                      { 
                          echo 
              htmlentities$request).'*<br/>';
                          
                          if(
              $action == 'read')
                          {
                              
              // Request gezielt überschreiben.
                              
              $request ' <Read xmlns="http://opcfoundation.org/webservices/XMLDA/1.0/">
                                             <Options ReturnErrorText="true"
                                                      ReturnDiagnosticInfo="true"
                                                      ReturnItemTime="false"
                                                      ReturnItemName="true"
                                                      ReturnItemPath="false"
                                                      ClientRequestHandle="XYZ"
                                                      LocaleID="" />
                                            <ItemList MaxAge="0">
                                              <Items MaxAge="0"
                                                 ItemName="CEA709 Port.Datapoints.Raumtemperatur"
                                                 ClientItemHandle="14213232" />
                                            </ItemList>
                                          </Read>'
              ;
                          }
                          
                          return 
              parent::__doRequest($request$location$action$version$one_way); 
                      } 
                  } 
              Vieles kann, wenig muss.

              Kommentar


              • #8
                Vielen Dank euch für die Antworten. Ich probiere das alles gleich mal aus.

                PS: Ich weiß auch nicht warum das bei mir immer so furchtbar formatiert ist.

                Kommentar


                • #9
                  ADD:

                  Ich hatte hier
                  http://leifmadsen.wordpress.com/2009...vice-with-php/
                  auch noch gelesen, dass man Complex Types so übergeben sollte, was haltet ihr davon?

                  Code:
                     $options = new StdClass();
                     $options->Options = new StdClass();
                     $options->Options->ReturnErrorText = true;
                     $options->Options->ReturnDiagnosticInfo = true;
                     $options->Options->ReturnItemTime = false;
                     $options->Options->ReturnItemPath = false;
                     $options->Options->ReturnItemName = true;
                     $options->Options->ClientRequestHandle = "XYZ";
                     $options->Options->LocaleID = "";
                     
                     $itemList = new StdClass();
                     $itemList->ItemList = new StdClass();
                     $itemList->ItemList->Items = new StdClass();
                     $itemList->ItemList->Items->ItemName = "CEA709 Port.Datapoints.Raumtemperatur";
                     $itemList->ItemList->Items->ClientItemHandle = "14213232";
                     $itemList->ItemList->Items->MaxAge = "0";
                  
                     $result = $client->Read(array($options, $itemList));

                  Kommentar


                  • #10
                    Ich habe den Artikel nur überflogen, aber es ist sicherlich keine Empfehlung wie man es machen sollte:
                    Note: I am not a programmer. What I’m showing may be entirely the WRONG approach to solving this issue, but it solves it for me
                    Ich persönlich sehe in Deinem Code-Snippet nicht viel Sinn erst eine StdClass zu erzeugen, um es dann wieder zu einem Array umzuwandeln. Dann kann man auch gleich ein Array erstellen.

                    Ansonsten probiere erstmal aus, was hier im Thread steht bevor Du wieder eine neue Baustelle aufmachst.

                    Kommentar


                    • #11
                      Hallo zusammen,

                      nach vielem hin und her probieren bin ich leider immer noch nicht weiter. Beide Lösungsansätze resultieren leider immer in einem Time Out.

                      Sobald ich die SOAP Nachricht mit einem kleinen Test Tool verschicke kommt die Antwort sofort zurück. (Siehe Screenshot)


                      Sieht jemand einen Fehler oder kann mir zumindest sagen warum ich trotz TRY CATCH keine Fehlermeldung zurück erhalte sondern nur das Browser Time Out?

                      Kommentar


                      • #12
                        Hast Du mal das probiert, was Varon geschrieben hat?
                        Damit kannst Du überprüfen, ob das übergebene Array wirklich genau so umgewandelt wird, wie Du es brauchst.
                        Ansonsten kannst Du auch mal alle Parameter entfernen, die auch in deinem Test-XML-String nicht enthalten sind.

                        Kommentar


                        • #13
                          Hi,

                          ja das habe ich gemacht und entsprechend deinen Quellcode angepasst (waren nur ein paar Kleinigkeiten) also nochmals vielen Dank an euch beide.

                          Ganz kurz mal so grundsätzlich:

                          Die "location" Variable beinhaltet die XML Datei zur Kommunikation und die "uri" Variable beinhaltet die Adresse des Servers auf dem die Anfrage ausgeführt werden soll oder?

                          Denn wenn ich ein bisschen mit den Client-Variablen herumspiele wird auch der Catch Blog angesprochen.

                          Danke für euere Hilfe,
                          Grüße

                          Kommentar


                          • #14
                            Das ist dann wahrscheinlich eher eine Exception von new SoapClient() und nicht von Deiner Read-Anfrage.
                            Du solltest zum Testen nach dem Verbindungsaufbau eine Ausgabe einbauen. Dann weißt Du wie weit Du gekommen bist.

                            Ansonsten aus dem Manual:
                            If working in non-WSDL mode, the location and uri options must be set, where location is the URL of the SOAP server to send the request to, and uri is the target namespace of the SOAP service.

                            Kommentar


                            • #15
                              Danke Pompei81 da bin ich auch schon drüber gestolpert, die Seite könnte bald meine Startseite sein
                              Ich habe das Problem jetzt so weit lokalisiert:

                              Die Anfrage geht raus, kommt am Server an aber der Server weiß anscheinend nicht wohin er sie zurückschicken soll.
                              Wenn ich mit meinem Test Tool die SOAP Anfrage "Read" verschicke sehe ich im Log File des Servers einen Eintrag mit Uhrzeit und unter der Dauer n/a, was für Abfrage abgearbeitet steht.

                              Verschicke ich mit meinem PHP Client die GetStatus Methode
                              PHP-Code:
                              $result $client->__soapCall("GetStatus", array('LocaleID' => "CN"'ClientRequestHandle' => "ABC")); 
                              wird diese im Log File ebenfalls als abgearbeitet dargestellt.

                              Verschicke ich die "Read" Methode wird die Verbindung dauerhaft als aktiv angezeigt und erst dann beendet wenn ich den Server neustarte.

                              Es muss ja an meinem Code liegen, sonst würde die Verbindung mit dem Test Tool ja auch in einer Endlosschleife resultieren.

                              Kommentar

                              Lädt...
                              X