SoapServer XML Datei übertragen

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

  • #16
    Perfekt, und warum wird die Funktion nicht erkannt bzw. warum bekomme ich einen 500er Error? Wenn ich vor $server ein:

    PHP-Code:
    echo file_get_contents('Amazon/FWSInventory/Mock/ListUpdatedInventorySupplyResponse.xml'TRUE); 
    eingebe, bekomme ich ein SOAP-ENV:ClientBad Request.

    Bei:

    PHP-Code:
    function ListUpdatedInventorySupply($request){

          return 
    file_get_contents('Amazon/FWSInventory/Mock/ListUpdatedInventorySupplyResponse.xml'TRUE);
    }

    $server = new SoapServer("AmazonFBAInventory.wsdl"); 
    $server->addFunction("ListUpdatedInventorySupply");
    $server->handle(); 
    gibt es einen 500er. Muss ich die Funktionen in eine Klasse einbinden und dann die Klasse an $server übergeben?

    Kommentar


    • #17
      Alles was das Serverskript ausgibt, landet beim Client als Antwort. Insofern sind deine Beobachtungen nur logisch. Wenn du dort was debuggen willst, musst du es in ein Logfile oder ins Syslog schreiben.
      [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


      • #18
        Bekomme jetzt folgenden Fehler im Client angezeigt, wenn die Server Datei fehlerhaft ist:

        Warning: DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 2...

        Wenn nicht, gibt es einen Error 500.
        Zuletzt geändert von herrentor; 21.05.2010, 23:37.

        Kommentar


        • #19
          SoapServer XML Datei übertragen

          Hey,

          ich komme einfach nicht weiter. Ich will doch einfach nur eine XML Datei durch Soap übertragen. Wird die Datei lokal eingelesen, klappt es auch, aber irgendwas stimmt nicht mit dem Webservice.

          Mein SoapServer:

          PHP-Code:
          function ListUpdatedInventorySupply($request){

          return 
          $xml file_get_contents('Amazon/FWSInventory/Mock/ListUpdatedInventorySupplyResponse.xml'TRUE);

          }

          ini_set("soap.wsdl_cache_enabled""0");
          $server = new SoapServer("https://fba.herrentor.de/AmazonFBAInventory.wsdl"); 
          $server->addFunction("ListUpdatedInventorySupply");
          $server->addFunction("GetInventorySupply");
          $server->handle(); 
          Mein SoapClient:

          PHP-Code:
          public function listUpdatedInventorySupply($request
              {
                  require_once (
          'Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php');
                  return 
          Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse::fromXML(
          $this->_invoke('ListUpdatedInventorySupply',$this->_convertListUpdatedInventorySupply($request)));
              }

          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;
              }

              private function 
          _invoke($actionName$request)
              {
                  
          $_soapClient = new SoapClient('http://web542.srv1.sysproserver.de/amazon/AmazonFBAInventory.wsdl');
                  
                  return 
          $_soapClient->$actionName($request);
              } 
          So funktioniert der Client:

          PHP-Code:
          public function listUpdatedInventorySupply($request
              {
                  require_once (
          'Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php');
                  return 
          Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse::fromXML(
          file_get_contents('Amazon/FWSInventory/Mock/ListUpdatedInventorySupplyResponse.xml'TRUE));
              } 
          Die ausgegebene Fehlermeldung ist:

          Warning: DOMDocument::loadXML() expects parameter 1 to be string, object given in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php on line 77 Fatal error: Uncaught exception 'Exception' with message 'Unable to construct Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse from provided XML. Make sure that ListUpdatedInventorySupplyResponse is a root element' in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php:84 Stack trace: #0 /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/SOAPClient.php(90): Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse::fromXML(Object(stdClass)) #1 /var/www/web542/html/oscommerce/catalog/admin/Amazon/functions.inc.php(106): Amazon_FWSInventory_SOAPClient->listUpdatedInventorySupply(Object(Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest)) #2 /var/www/web542/html/oscommerce/catalog/admin/amazon_stock.php(68): invokeListUpdatedInventorySupply(Object(Amazon_FWSInventory_SOAPClient), Object(Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest)) #3 {main} thrown in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php on line 84

          Wie kann ich die XML Datei übergeben, damit sie so ankommt, als wenn Sie lokal geladen worden wäre? Vielleicht etwas in der WSDL Datei falsch?

          https://fba.herrentor.de/AmazonFBAInventory.wsdl

          Habe einfach die fertige WSDL Datei von Amazon genommen und ganz unten die Soap Adresse bei Service geändert, so dass zu meinem Server weitergeleitet wird. Der Name des Service ist AmazonFBAInventory, eventuell das als Klasse dem SoapServer übergeben?

          Danke Euch im voraus schon mal.

          Kommentar


          • #20
            expects parameter 1 to be string, object given
            Du übergibts ein Objekt und keine Zeichenkette. Schau dir ggf. mal die magische Methode __toString an. Vielleicht liegt es daran. Aber

            Peter
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #21
              Die Fehlermeldung kommt allerdings auch wenn ich einen String übergebe.

              Kommentar


              • #22
                Zitat von herrentor Beitrag anzeigen
                Die Fehlermeldung kommt allerdings auch wenn ich einen String übergebe.
                Ist sie denn wirklich identisch?

                Peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #23
                  Ja, exakt die gleiche XML Datei. Hab gerade auch nochmal die eine überschrieben um sicher zu gehen. Der Fehler bleibt.

                  Anscheinend wird noch etwas anderes vom Server übergeben. Wenn ich das Übergebene per echo ausgeben will, wird dieser Fehler geworfen:

                  Catchable fatal error: Object of class stdClass could not be converted to string in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php on line 77

                  Kommentar


                  • #24
                    Auch wenn ich herzlich wenig Ahnung von deinem Problem habe, so denke ich, dass du dich wirklich mal mit __toString beschäftigen solltest. Ich bekam diese Meldungen immer, als ich ein Projekt von PHP4 auf 5 umstellen musste. Und das hat immer geholfen.

                    Peter

                    PS: Vielleicht liegt es auch an einer alten osCommerce-Version in Kombination mit einer neuen PHP5-Version,
                    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                    Meine Seite

                    Kommentar


                    • #25
                      Hab es jetzt mal in einer Testdatei überprüft ob es an osCommerce liegen kann, denke aber nicht, weil ich die gleiche Fehlermeldung bekomme. Die Testdatei habe ich zwar aus einem osCommerce Ordner aufgerufen, aber ansonsten war sie davon unabhängig.

                      Catchable fatal error: Object of class stdClass could not be converted to string in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php on line 77

                      Kann es eventuell auch an falschen Server Einstellungen liegen?
                      Zuletzt geändert von AmicaNoctis; 25.05.2010, 13:11. Grund: Doppelposting

                      Kommentar


                      • #26
                        Zitat von herrentor
                        Kann es eventuell auch an falschen Server Einstellungen liegen?
                        Unwahrscheinlich. Was steht denn in besagter Zeile 77? Du zeigst uns zwar ab und an irgendwelche Dateien, aber nicht die Namen dazu. Ich konnte jedenfalls noch nicht erkennen, welches Script jetzt mit welchem Statement diesen Fehler verursacht.

                        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


                        • #27
                          Ok, sorry. Zeile 77 der Datei ListUpdatedInventorySupplyResponse war für den Fehler echo $xml.

                          Warning: DOMDocument::loadXML() expects parameter 1 to be string, object given in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php on line 77 Fatal error: Uncaught exception 'Exception' with message 'Unable to construct Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse from provided XML. Make sure that ListUpdatedInventorySupplyResponse is a root element' in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php:84 Stack trace: #0 /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/SOAPClient.php(90): Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse::fromXML(Object(stdClass)) #1 /var/www/web542/html/oscommerce/catalog/admin/Amazon/functions.inc.php(106): Amazon_FWSInventory_SOAPClient->listUpdatedInventorySupply(Object(Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest)) #2 /var/www/web542/html/oscommerce/catalog/admin/amazon_stock.php(68): invokeListUpdatedInventorySupply(Object(Amazon_FWSInventory_SOAPClient), Object(Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest)) #3 {main} thrown in /var/www/web542/html/oscommerce/catalog/admin/Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php on line 84

                          Vielleicht nochmal ausführlich:

                          amazon_stock.php
                          PHP-Code:
                          include_once ('Amazon/functions.inc.php'); 
                           
                            
                          $array = array('NumberOfResultsRequested' => MAX_DISPLAY_SEARCH_RESULTS,
                                             
                          'QueryStartDateTime'       => "2010-01-01T00:00:00Z",
                                             
                          'ResponseGroup'             => "Basic");
                            
                            
                          $request = new Amazon_FWSInventory_Model_ListUpdatedInventorySupplyRequest($array);
                            
                            
                          invokeListUpdatedInventorySupply($serviceInventory$request); 
                          functions.inc.php
                          PHP-Code:
                          $serviceInventory = new Amazon_FWSInventory_SOAPClient(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY);

                          function 
                          invokeListUpdatedInventorySupply(Amazon_FWSInventory_Interface $service$request
                            {
                                try {
                                        
                          $response $service->listUpdatedInventorySupply($request);
                                        
                          $listUpdatedInventorySupplyResult $response->getListUpdatedInventorySupplyResult();
                                        
                          $merchantSKUSupplyList $listUpdatedInventorySupplyResult->getMerchantSKUSupply();
                                          
                                          foreach (
                          $merchantSKUSupplyList as $merchantSKUSupply) {
                                              
                                          
                          $products_query_raw "select pd.products_id, pd.products_name, l.name from " 
                          TABLE_PRODUCTS_DESCRIPTION " pd, " TABLE_LANGUAGES " l where pd.products_id = " 
                          $merchantSKUSupply->getMerchantSKU() . " and l.languages_id = pd.language_id and l.languages_id = 2";
                                            
                          $products_split = new splitPageResults($HTTP_GET_VARS['page'], 1
                          $products_query_raw$products_query_numrows);
                                            
                          $products_query tep_db_query($products_query_raw);
                                          while (
                          $products tep_db_fetch_array($products_query)) {
                                          
                                              
                          $rows++;

                                              if (
                          strlen($rows) < 2) {
                                                    
                          $rows '0' $rows;
                                              }
                                          
                                          echo 
                          '<tr class="dataTableRow" onMouseOver="rowOverEffect(this)" 
                          onMouseOut="rowOutEffect(this)" onClick="document.location.href='
                          tep_href_link(FILENAME_CATEGORIES
                          'action=new_product_preview&read=only&pID='$products['products_id'] . '&origin=' 
                          FILENAME_STATS_PRODUCTS_VIEWED '?page=' $HTTP_GET_VARS['page'], 'NONSSL') . '">
                                                <td class="dataTableContent" align="center">' 
                          $rows '.&nbsp;</td>
                                                <td class="dataTableContent">' 
                          $merchantSKUSupply->getMerchantSKU() . '</td>
                                                <td class="dataTableContent"><a href="' 
                          tep_href_link(FILENAME_CATEGORIES
                          'action=new_product_preview&read=only&pID=' $products['products_id'] . '&origin=' 
                          FILENAME_STATS_PRODUCTS_VIEWED '?page=' $HTTP_GET_VARS['page'], 'NONSSL') . '">' 
                          $products['products_name'] . '</a> (' $products['name'] . ') </td>
                                                <td class="dataTableContent" align="left">' 
                          $merchantSKUSupply->getASIN() . '&nbsp;</td>
                                                <td class="dataTableContent" align="center">' 
                          $merchantSKUSupply->getTotalSupplyQuantity() 
                          .
                          '&nbsp;</td>
                                                <td class="dataTableContent" align="center">' 
                          $merchantSKUSupply->getInStockSupplyQuantity() 
                          .
                          '&nbsp;</td>
                                                  </tr>'
                          ;
                                          }
                                          }


                               } catch (
                          Amazon_FWSInventory_Exception $ex) {
                                   echo(
                          "Caught Exception: " $ex->getMessage() . "\n");
                                   echo(
                          "Response Status Code: " $ex->getStatusCode() . "\n");
                                   echo(
                          "Error Code: " $ex->getErrorCode() . "\n");
                                   echo(
                          "Error Type: " $ex->getErrorType() . "\n");
                                   echo(
                          "Request ID: " $ex->getRequestId() . "\n");
                                   echo(
                          "XML: " $ex->getXML() . "\n");
                               }
                           } 
                          SOAPClient.php Klasse
                          PHP-Code:
                          public function listUpdatedInventorySupply($request
                              {
                                  require_once (
                          'Amazon/FWSInventory/Model/ListUpdatedInventorySupplyResponse.php');
                                  return 
                          Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse::fromXML(
                          $this->invoke('ListUpdatedInventorySupply'$this->convertListUpdatedInventorySupply($request)));
                                  
                              }

                          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;
                              }
                              
                               
                          /**
                               * Convert paremeters to Url encoded query string
                               */
                              
                          private function getParametersAsString(array $parameters)
                              {
                                  
                          $queryParameters = array();
                                  foreach (
                          $parameters as $key => $value) {
                                      
                          $queryParameters[] = $key '=' $this->_urlencode($value);
                                  }
                                  return 
                          implode('&'$queryParameters);
                              }

                              private function 
                          _urlencode($value) {
                                  return 
                          str_replace('%7E''~'rawurlencode($value));
                              }
                              
                              private function 
                          invoke($actionName, array $parameters)
                              {
                                  
                          $soapClient = new SoapClient('http://web542.srv1.sysproserver.de/amazon/AmazonFBAInventory.wsdl');
                                  
                                  return 
                          $soapClient->$actionName($this->getParametersAsString($parameters));
                              } 
                          Diese Meldung kommt aus der Funktion loadXML($xml), wenn ich das echo wieder entferne und dieser Funktionsaufruf bei Zeile 77 ist.

                          ListUpdatedInventorySupplyResponse.php
                          PHP-Code:
                          public static function fromXML($xml)
                              {
                                  
                          $dom = new DOMDocument();
                                  
                          $dom->loadXML($xml);
                                  
                          $xpath = new DOMXPath($dom);
                                  
                          $xpath->registerNamespace('a''http://fba-inventory.amazonaws.com/doc/2009-07-31/');
                                  
                          $response $xpath->query('//a:ListUpdatedInventorySupplyResponse');
                                  if (
                          $response->length == 1) {
                                      return new 
                          Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse(($response->item(0))); 
                                  } else {
                                      throw new 
                          Exception ("Unable to construct 
                          Amazon_FWSInventory_Model_ListUpdatedInventorySupplyResponse from provided XML. 
                                                            Make sure that ListUpdatedInventorySupplyResponse is a root element"
                          );
                                  }
                                    
                              } 
                          Kann die Dateien auch anhängen, hab bloß die Befürchtung das es eher abschreckt als Hilft. Werd dann jetzt erstmal bisschen lesen wie ich das mit der print_r Funktion und der LogDatei mache.
                          Zuletzt geändert von herrentor; 25.05.2010, 14:00.

                          Kommentar


                          • #28
                            Wenn $xml kein String ist, hast du mal überprüft, was es dann ist (print_r in eine Logdatei) und wo es herkommt?
                            [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