Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP und SOAP timeout

Einklappen

Neue Werbung 2019

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

  • PHP und SOAP timeout

    Hallo,

    ich hab ein kleines Problem mit SOAP. Ich möchte auf einen Webservice zugreifen und mir einige Sachen anzeigen lassen.

    Ich habe zwei Lösungsansätze:


    (EDIT) - Es lag am HTTP/1.1 -.-, mit HTTP/1.0 bekomme ich auch endlich eine Antwort.

    Trozdem besteht Problem Nummer 2 noch ^^

    1)

    XML mit fputs senden:

    Hierbei sende ich die XML mit fputs an den Webservice, jedoch lädt er sich bei der Aktion tot. Die XML ist korrekt, der Webservice bietet die Möglichkeit das zu testen, es muss also am Senden liegen.

    Code:
    PHP-Code:
    <?php
    $fp 
    fsockopen("--HOST--"80$errno$errstr);
      
      if (!
    $fp) {
        echo 
    "$errstr ($errno)<br />";
      } 
      else{
        
    $quest '
          <?xml version="1.0" encoding="utf-8"?>
          ---XML---
        '
    ;
        
        
    $soap_out  "POST ---PATH--- HTTP/1.1\n";
        
    $soap_out .= "Host: ---HOST---\n";
        
    $soap_out .= "Content-Type: application/soap+xml; charset=utf-8\n";
        
    $soap_out .= "Content-Length: ".strlen($quest)."\n\n";
        
    $soap_out .= $quest;
        
        
    fputs($fp$soap_out);
        while (!
    feof($fp)) {
          
    $soap_in .= fgets($fp100);
        }
        
    var_dump($soap_in);
        
    fclose($fp);
      }  
    ?>
    Villeicht ist der Port falsch, jetzt wo ich das so sehe ?

    (EDIT)

    habs mal umpositioniert und starte fsockopen erst wenn $soap_out fertig ist:

    PHP-Code:
    <?php
    $quest 
    '
          <?xml version="1.0" encoding="utf-8"?>
          ---XML---
        '
    ;
        
        
    $soap_out  "POST ---PATH--- HTTP/1.1\n";
        
    $soap_out .= "Host: ---HOST---\n";
        
    $soap_out .= "Content-Type: application/soap+xml; charset=utf-8\n";
        
    $soap_out .= "Content-Length: ".strlen($quest)."\n\n";
        
    $soap_out .= $quest;
        
        echo 
    $soap_out;
        
        
    $fp fsockopen("---HOST---"80);
        
    fputs($fp$soap_out);
        while (!
    feof($fp)) {
          
    $soap_in .= fgets($fp100);
        }
        
    var_dump($soap_in);
        
    fclose($fp); 
    ?>
    Die Ausgabe ist auch völlig OK und da ich mit der SOAP-Klasse auf den Webservice zugreifen kann, kann ja eigentlich nurnoch der Port falsch sein oder ? Was ist denn der Standard-Port vom Webservice ? - Gibt es überhaupt einen ? - Woher weiß die SOAP-Klasse worauf sie zugreifen muss ?

    2)

    SOAP mit PHP

    Hierbei nutze ich die native SOAP-Klasse von PHP5 um eine Verbindung aufzubauen. An dieser Stelle wurde mir empfohlen NICHT die native Klasse von PHP5 zu nehmen.

    Aber damit kriege ich eine Verbindung und kann mir auch die Funktionen anzeigen lassen. Meine Frage an dieser Stelle bezieht sich mehr auf den Aufbau.

    Die XML sollte so aussehen:

    Code:
    <POS>
      <Source AgentDutyCode="---USERNAME---">
        <RequestorID Type="1" MessagePassword="---PASSWORT---" />
      </Source>  
    </POS>
    <AvailRequestSegments>
      ---XML-Request---
    </AvailRequestSegments>
    PHP-Code:
    try{  
          
    $client = new SOAPClient('---HOST---');
          
          
    $username '---USER---';
          
    $password '---PASS---';
          
          
    $auth = array();
          
    $auth['AgentDutyCode'] = new SOAPVar($usernameXSD_STRING);
          
    $auth['MessagePassword'] = new SOAPVar($passwordXSD_STRING);
          
    $headerBody = new SOAPVar($authSOAP_ENC_OBJECT);
          
    $header = new SOAPHeader(---FEHLER---, 'POS'$headerBody);
          
    $client->__setSOAPHeaders(array($header));

          
    $data $client->__getFunctions();
        
          echo 
    '<br><br>';
          for(
    $c=0;$c<=count($client->__getFunctions());$c++){
            echo 
    $data[$c].'<br>';
          }
        }
        catch(
    SOAPFault $f){
          print 
    $f->faultstring;
        } 
    Ich muss die Logindaten bei jeder XML mitsenden, es gibt aber keine Funktion Login oder so, wie mach eich das dann am besten ? - Ich habe Beispiele mit "__setSOAPHeaders" gesehen, jedoch verstehe ich nicht ganz wie das dann in meinem Beispiel funktionieren soll.


    (EDIT)

    Ok dank __getLastRequest() konnte ich mir mein XML-Request anzeigen lassen und dementsprechend handeln.

    Neuer Code:

    PHP-Code:
    try{  
          
    $client = new SOAPClient('---HOST---', array('trace' => 1));
          
          
    $username '---USER---';
          
    $password '---PASS---';
          
          
    $auth = array();
          
    $auth['AgentDutyCode'] = new SOAPVar($usernameXSD_STRING);
          
    $auth['MessagePassword'] = new SOAPVar($passwordXSD_STRING);
          
    $headerBody = new SOAPVar($authSOAP_ENC_OBJECT);
          
    $header = new SOAPHeader('"http://www.w3.org/2001/XMLSchema-instance''POS'$headerBody);
          
    $client->__setSOAPHeaders(array($header));

          
    $data $client->__getFunctions();
          
          echo 
    "<pre>Anfrage:<br><br>".str_replace(">","&gt;",str_replace("<","&lt;",$client->__getLastRequest()))."</pre><br>"
        
          echo 
    '<br><br>';
          for(
    $c=0;$c<=count($client->__getFunctions());$c++){
            echo 
    $data[$c].'<br>';
          }
        }
        catch(
    SOAPFault $f){
          print 
    $f->faultstring;
        } 
    Das Problem ist aber nun dass die Logindaten im Header sind, sie aber in den Body gehören. Außerdem sieht mein request so aus:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="---" xmlns:ns1="---" xmlns:ns2='"---'>
      <SOAP-ENV:Header>
        <ns2:POS>
          <AgentDutyCode>---USER---</AgentDutyCode>
          <MessagePassword>---PASS---</MessagePassword>
        </ns2:POS>
      </SOAP-ENV:Header>
      <SOAP-ENV:Body>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    Er sollte aber so aussehen:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="---" xmlns:ns1="---" xmlns:ns2='"---'>
      <SOAP-ENV:Body>
        <ns2:POS>
          <Source AgentDutyCode="---USER---">
            <RequestorID Type="1" MessagePassword="---PASS---" />
          </Source>
        </ns2:POS>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    ------------------------------------------

    Also das sind meine beiden Probleme, unabhängig davon würde ich auch gern wissen welchen Weg ich denn nun verwenden sollte ? - XML per fputs oder die native SOAP-Klasse ?

    Danke im Vorraus
    Yuen

  • #2
    Ich verwende nusoap und komme bestens damit zurecht.
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar

    Lädt...
    X