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:

<?xml version="1.0" encoding="UTF-8"?>
<Errors xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
   <Error>
      <Code>AWS.InvalidOperationParameter</Code>
      <Message>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.</Message>
   </Error>
</Errors>

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:

1
2
3
4
5
6
7
8
9
10
11
12
// 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:

1
2
$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:

object(SimpleXMLElement)#1 (1) {
  ["Error"]=>
  object(SimpleXMLElement)#2 (2) {
    ["Code"]=>
    string(29) "AWS.InvalidOperationParameter"
    ["Message"]=>
    string(461) "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."
  }
}

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:

echo $xmlobject->Error->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

Google Analytics GA.PI() – Klasse um Analytics mit... Dass Google Analytics eine API anbietet, um direkt Daten auszulesen und diese selbst darzustellen ist nichts Neues. Wie bei allen APIs stellt sich abe...
Der perfekte Code Editor für PHP Zur Abwechslung fange ich mal mit einem Rant an! ;) Diese ganzen halbgaren Java-Zeitlupen-IDEs nerven, und zwar ganz gehörig. Ist ja nett das Java so ...
Tutorial Amazon Web Services mit PHP – III &... Im vorherigen Teil haben wir eine XML von den AWS mit cURL geladen. Aber Was heißt eigentlich Funktionscaching, und wieso brauchen wir das? Ganz einfa...
Bearbeiten von Bilderin in PHP mit PHPImageWorksho... Man kann von Drupal halten was man will, aber ich bleibe da stets bei meiner Meinung, dass die Module zur Bildmanipulationen die besten sind, die am C...

2 Antworten auf „Tutorial Amazon Web Services mit PHP – II – cURL und SimpleXML“

  1. 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 );

  2. 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.