SoapServer XML Datei übertragen

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

  • SoapServer XML Datei übertragen

    Hallo,

    hab jemand eine Ahnung, welcher Pfad richtig für eine Verbindung zu einer SoapServer *.php Datei ist?

    Übergebe ich den direkten Pfad zur Datei:

    http://web542.srv1.sysproserver.de/amazon/inventory.php

    bekomme ich mehrere "Warning: DOMDocument::loadXML(): Opening and ending tag mismatch" Fehlermeldungen. Diese bekomme ich allerdings auch, wenn eine nicht existierende Datei angesprochen wird. Übergebe ich den Pfad:

    http://fba-inventory.herrentor.de

    der dann zur obigen Datei weiterleitet, bekomme ich einen Error 302 und die selbe Adresse als https, gibt einen Error 500.

    Wie kann ich erkennen, ob wenigstens die Webservice Verbindung zwischen Client und Server besteht?

    Danke schon mal im voraus.

  • #2
    Hallo,

    Zitat von herrentor Beitrag anzeigen
    welcher Pfad richtig für eine Verbindung zu einer SoapServer *.php Datei ist?
    Das sagt dir normalerweise der Betreiber des Service.

    Zitat von herrentor Beitrag anzeigen
    bekomme ich mehrere "Warning: DOMDocument::loadXML(): Opening and ending tag mismatch" Fehlermeldungen.
    Dann liefert die Ressource einfach kein (gültiges) XML aus => Betreiber fragen.

    Zitat von herrentor Beitrag anzeigen
    bekomme ich einen Error 302
    302 ist kein Error, sondern ein Umleitungsstatus.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Danke Dir für die schnell Antwort. Betreiber bin in diesem Fall ich selber und ich weiß nicht genau welchen Pfad ich angeben muss.

      Für mich hört sich der Warning: DOMDocument::loadXML() Fehler am besten an, bzw. ich schließe daraus das eine Verbindung besteht und wie Du sagtest eine ungültige XML Datei zurückgegeben wird. Aber warum bekomm ich dann den gleichen Fehler, wenn ich eine nicht existierende Datei als Pfad angebe?

      Kommentar


      • #4
        Zitat von herrentor Beitrag anzeigen
        Aber warum bekomm ich dann den gleichen Fehler, wenn ich eine nicht existierende Datei als Pfad angebe?
        Weil der Webserver dann trotzdem ein ErrorDocument schickt, welches vermutlich nicht als valides XML durchgeht. Du kannst dir das ja einfach mal im Browser ansehen.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Ok, dann bin ich schon mal einen Schritt schlauer. Warum ich diesen Fehler bekomme, kann ich allerdings nicht richtig nachvollziehen.

          Die angesprochene Datei auf dem Server liefert mir normalerweise ein XML Dokument, welches der Client bei lokaler Übergabe verarbeiten kann.


          PHP-Code:
          function ListUpdatedInventorySupply($request){
            
          $xml file_get_contents('Amazon/FWSInventory/Mock/ListUpdatedInventorySupplyResponse.xml'TRUE);
            
          $dom = new DOMDocument();
            
          $dom->loadXML($xml);
            return 
          $dom;

          PHP-Code:
          $server = new SoapServer("AmazonFBAInventory.wsdl"); 
          $server->addFunction("ListUpdatedInventorySupply");
          $server->handle(); 
          Oder wird eine XML Datei anders übergeben?

          Kommentar


          • #6
            Wo kommt denn die Fehlermeldung her? Wenn sie schon in der ListUpdatedInventorySupply-Funktion auftritt, stimmt z. B. einfach der Pfad nicht.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Der Fehler entsteht beim einlesen der XML Datei im Client in der Funktion fromXML. Wenn ich dort die XML Datei lokal lade, funktioniert es.

              Funktionsaufruf im Client:
              PHP-Code:
              public function listUpdatedInventorySupply($request)
                  {
                      if (!
              $request instanceof Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest) {
                          require_once (
              'Amazon/FWSInventory/Model/ListUpdatedInventorySupplyRequest.php');
                          
              $request = new Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest($request);
                      }
                      require_once (
              'Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php');
                      return 
              Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse::fromXML(
              $this->_invoke($this->_convertListUpdatedInventorySupply($request)));
                  } 
              PHP-Code:
               private function _convertListUpdatedInventorySupply($request) {
                      
                      
              $parameters = array();
                      
              $parameters['Action'] = 'ListUpdatedInventorySupply';
                      if (
              $request->isSetNumberOfResultsRequested()) {
                          
              $parameters['NumberOfResultsRequested'] =  $request->getNumberOfResultsRequested();
                      }
                      if (
              $request->isSetQueryStartDateTime()) {
                          
              $parameters['QueryStartDateTime'] =  $request->getQueryStartDateTime();
                      }
                      if (
              $request->isSetResponseGroup()) {
                          
              $parameters['ResponseGroup'] =  $request->getResponseGroup();
                      }

                      return 
              $parameters;
                  } 
              PHP-Code:
              private function _invoke(array $parameters)
                  {
                      
              $actionName $parameters["Action"];
                      
              $response = array();
                      
              $responseBody null;
                      
              $statusCode 200;

                      
              /* Submit the request and read response body */
                      
              try {

                          
              /* Add required request parameters */
                          
              $parameters $this->_addRequiredParameters($parameters);

                          
              $shouldRetry true;
                          
              $retries 0;
                          do {
                              try {
                                      
              $response $this->_httpPost($parameters);
                                      if (
              $response['Status'] === 200) {
                                          
              $shouldRetry false;
                                      } else {
                                          if (
              $response['Status'] === 500 || $response['Status'] === 503) {
                                              
              $shouldRetry true;
                                              
              $this->_pauseOnRetry(++$retries$response['Status']);
                                          } else {
                                              throw 
              $this->_reportAnyErrors($response['ResponseBody'], $response['Status']);
                                          }
                                     }
                              
              /* Rethrow on deserializer error */
                              
              } catch (Exception $e) {
                                  require_once (
              'Amazon/FWSInventory/Exception.php');
                                  if (
              $e instanceof Amazon_FWSInventory_Exception) {
                                      throw 
              $e;
                                  } else {
                                      require_once (
              'Amazon/FWSInventory/Exception.php');
                                      throw new 
              Amazon_FWSInventory_Exception(array('Exception' => $e,
               
              'Message' => $e->getMessage()));
                                  }
                              }

                          } while (
              $shouldRetry);

                      } catch (
              Amazon_FWSInventory_Exception $se) {
                          throw 
              $se;
                      } catch (
              Exception $t) {
                          throw new 
              Amazon_FWSInventory_Exception(array('Exception' => $t'Message' => $t->getMessage()));
                      }

                      return 
              $response['ResponseBody'];
                  } 
              PHP-Code:
              private function _httpPost(array $parameters)
                  {

                      
              $query $this->_getParametersAsString($parameters);
                      
              $url parse_url ($this->_config['ServiceURL']);
                      
              $post  "POST / HTTP/1.0\r\n";
                      
              $post .= "Host: " $url['host'] . "\r\n";
                      
              $post .= "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n";
                      
              $post .= "Content-Length: " strlen($query) . "\r\n";
                      
              $post .= "User-Agent: " $this->_config['UserAgent'] . "\r\n";
                      
              $post .= "\r\n";
                      
              $post .= $query;
                      
              $port array_key_exists('port',$url) ? $url['port'] : null;
                      
              $scheme '';

                      switch (
              $url['scheme']) {
                          case 
              'https':
                              
              $scheme 'ssl://';
                              
              $port $port === null 443 $port;
                              break;
                          default:
                              
              $scheme '';
                              
              $port $port === null 80 $port;
                      }

                      
              $response '';
                      if (
              $socket = @fsockopen($scheme $url['host'], $port$errno$errstr10)) {

                          
              fwrite($socket$post);

                          while (!
              feof($socket)) {
                              
              $response .= fgets($socket1160);
                          }
                          
              fclose($socket);

                          list(
              $other$responseBody) = explode("\r\n\r\n"$response2);
                          
              $other preg_split("/\r\n|\n|\r/"$other);
                          list(
              $protocol$code$text) = explode(' 'trim(array_shift($other)), 3);
                      } else {
                          throw new 
              Exception ("Unable to establish connection to host " $url['host'] . $errstr");
                      }


                      return array (
              'Status' => (int)$code'ResponseBody' => $responseBody);
                  } 
              Was muss ich vom SoapServer übergeben, um die gleiche Verarbeitung zu bekommen, als wenn ich der Funktion fromXML einfach die XML Datei lokal übergebe?

              Kommentar


              • #8
                Mir fällt grad was auf und ein: Du kannst es als XML-Code ausliefern, aber nicht als DOMDocument-Objekt, weil das ja nicht direkt iterierbar ist. Alternativ dazu könntest du das DOM in ein Array packen. Das ist genau wie bei Sessions: Nicht alles ist serialisierbar.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Wenn ich einfach das XML Dokument zurückgebe, kommt der gleiche Fehler und einen Debugger bekomme ich nicht zum laufen.
                  Zuletzt geändert von herrentor; 21.05.2010, 15:59.

                  Kommentar


                  • #10
                    Zitat von herrentor Beitrag anzeigen
                    Wenn ich einfach das XML Dokument zurückgebe, kommt der gleiche Fehler.
                    Dann weiß ich auch nicht weiter, tut mir leid.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Ok, danke Dir trotzdem für die Mühe.
                      Zuletzt geändert von herrentor; 21.05.2010, 18:56.

                      Kommentar


                      • #12
                        Hab jetzt rausgefunden das immer nur die Index Datei angesprochen wird, egal welchen Pfad man angibt. Jemand eine Ahnung wie man das ändern kann?

                        Wenn ich meine SoapServer Datei als Index mache, werden die Funktionen aber auch nicht angesprochen und es gibt einen 500er Error.

                        Wenn die Server Datei ein echo mit einem XML Dokument ausgibt, bekomme ich ein Warning: DOMDocument::loadXML().

                        Warum werden die Funktionen nicht gefunden?

                        Kommentar


                        • #13
                          Zitat von herrentor Beitrag anzeigen
                          Hab jetzt rausgefunden das immer nur die Index Datei angesprochen wird, egal welchen Pfad man angibt. Jemand eine Ahnung wie man das ändern kann?
                          Das klingt nach Request Funneling mit ModRewrite.
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Liegt am parsen der URL. In der Funktion _httpPost die ich schon in einer vorigen Antwort eingefügt habe.

                            Weiß aber jetzt nicht genau wo $url['path'] anhängen muss.

                            Kommentar


                            • #15
                              Zwischen „POST“ und „HTTP 1.0“.
                              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                              Super, danke!
                              [/COLOR]

                              Kommentar

                              Lädt...
                              X