Tutorial Amazon Web Services mit PHP – II – cURL und SimpleXML

Im vorherigen Teil haben wir zumindest schon einmal einen API-Key und eine Partner-ID besorgt, jetzt geht es ans Eingemachte. AWS sind ein Service, der logischerweise per XML angesprochen wird. Will heißen: Ich rufe eine URL mit den entsprechenden Parametern auf und erhalte als Antwort eine XML, die ausgewertet werden muss.

Also Beispiel folgende URL:

http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService

gibt folgendes Ergebnis zurück:



   
      AWS.InvalidOperationParameter
      The Operation parameter is invalid. Please modify the Operation parameter and retry. Valid values for the Operation parameter include TagLookup, ListLookup, CartGet, SellerListingLookup, CustomerContentLookup, ItemLookup, SimilarityLookup, SellerLookup, ItemSearch, VehiclePartLookup, BrowseNodeLookup, CartModify, ListSearch, CartClear, VehiclePartSearch, CustomerContentSearch, CartCreate, TransactionLookup, VehicleSearch, SellerListingSearch, CartAdd, Help.
   

Wobei es sich logischerweise um eine Fehlermeldung handelt, da wir den AWS nicht gesagt haben, was wir von ihnen wollen. Aus PHP-Sicht kommen nun direkt zwei Probleme auf einen zu:

a) Man muss Inhalte von einer entfernten URL einlesen und verarbeiten
b) Man muss das XML verstehen und parsen, das man als Antwort erhält

Beim Punkt a) hilft uns cURL – eine Bibliothek von Daniel Stenberg, die Verbindungen zu verschiedensten Servern unter Verwendung diverser Protokolle erlaubt. Mit cURL können wir die oben genannte URL öffnen, und die Antwort des Services in einem String speichern:

// Initialisieren einer cURL-Session, und den resultierenden Handler in $ch speichern.
$ch = curl_init();
// cURL die gewünschte URL mitteilen
curl_setopt( $ch, CURLOPT_URL, „http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService" );
// Die Ausgabe des Headers unterdrücken
curl_setopt( $ch, CURLOPT_HEADER, 0 );
// Die Antwort als String zurück geben
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
// Seite aufrufen und Antwort in $answer speichern
$answer = curl_exec( $ch );
// Ressourcen wieder freigeben
curl_close( $ch );

Nach diesen einfachen Zeilen Code ist die Antwort der AWS nun in der Variable $answer gespeichert. Man könnte diese zum Beispiel durch ein echo $answer; ausgeben, und würde das gleiche Ergebnis sehen, wie bei einem direkten Aufruf der URL mit dem Browser.

In $answer ist nun allerdings ein XML gespeichert, das wir verstehen und auswerten müssen. Hierbei hilft uns SimpleXML, das – wie der Name schon sagt – eine einfache Bearbeitung von XML ermöglichen soll. Besonders interessant für uns ist die Funktion simplexml_load_string, die eine XML aus einem String in ein Objekt überführt. Dieses Objekt kann dann einfach weiter bearbeitet werden. Anhand unseres Beispiels ist dies recht einfach nachzuvollziehen:

$xmlobject = simple_xml_load_file( $answer );
var_dump( $xmlobject );

Die Ausgabe hilft auf den ersten Blick zwar nicht viel weiter als das XML, wir haben aber nun ein Objekt, mit dem wir arbeiten können:

Eine „Eigenart“ von SimpleXML ist es derweil, ein umgebendes XML-Tag zu unterdrücken, das <Errors> aus obigem Beispiel hat es nicht ins XML geschafft! Dies sollte man immer in Gedächtnis behalten, da man ansonsten graue Haare bekommt, wenn man auf Pfade innerhalb des XML zugreifen will.

Möchte man sich jetzt nur den Error-Code der AWS anzeigen lassen, reicht die folgende Zeile Code:

Somit kann man nun einfach die Antwort der AWS auswerten und weiter verarbeiten. Allerdings kann man sich nun ebenfalls an 5 Finger abzählen das bei einer solchen Abfrage jede Menge Fehler auftreten können, im schlimmsten Fall zum Beispiel das keine Verbindung zu den AWS aufgebaut wird. Das Ganze ist derzeit auch nicht sonderlich performant. Es macht zum Beispiel keinen Sinn permanent alle Daten von den AWS live herunterzuladen, deshalb beschäftigen wir uns im nächsten Teil des Tutorials zunächst einmal mit dem Cachen von Funktionsaufrufen in PHP.

Ähnliche Beiträge

Die Wunderwelt von PHP und cURL PHP kann eine Menge, und eine Menge sogar doppelt bis dreifach. Das öffnen entfernter Dateien kann mittels "normalem" Dateihandling auch über die soge...
Quality Assurance für PHP Sebastian Bergmann (ja, der von phpUnit) hat in seinem Blog einen interessanten Beitrag über Quality Assurance Tools für PHP veröffentlicht. Im Einzel...
Tutorial Amazon Web Services mit PHP – I ... Die Amazon Web Services sind recht nett, wenn man einfach und schnell Content auf seine eigenen Seiten bringen möchte. Dabei geht es noch nicht einmal...
PHP Fehlermeldungen in der Console PHP ist eine feine Sache, und "früher" konnter man sogar ordentlich was mit den Fehlermeldungen anfangen. Da gab es noch "einfaches" HTML, heutzutage ...

2 Kommentare

  • Wieder falsch!
    Warum wird im Text die Funktion simplexml_load_string() erwähnt, im Code dann aber simple_xml_load_file(), bzw. simplexml_load_file() verwendet? Es soll doch gar kein File eingelesen werden. Der Inhalt ist doch bereits in einem String!

    Richtig müsste also sein:
    $xmlobject = simplexml_load_string( $answer );
    var_dump( $xmlobject );

  • Hallo,

    tolles Tutorial. Habe einen Fehler entdeckt und zwar im Code zu SimpleXML.

    $xmlobject = simple_xml_load_file( $answer );
    var_dump( $xmlobject );

    richtig wäre

    $xmlobject = simplexml_load_file( $answer );
    var_dump( $xmlobject );

Schreibe einen Kommentar