Datenbankabfrage(XML) über PHP

EmJayy

Mitglied
Ich habe gestern schon mal einen Hilfeaufruf gestartet jedoch euch die falschen Voraussetzungen gegeben. Heut nun ein erneuter Versuch!!

Ich soll eine Anfrage bei einer Datenbank durchführen (ohne Soap!!)! Die Anfragen habe ich in Form einer XML- Struktur:

Beispiel:

<?xml version="1.0"?>
<Request>
<UserName>smartuser</UserName>
<Password>password</Password>
<Command>GetUser</Command>
</Request>


die Serveradresse lautet: http://api.marketworks.com/api/apiCall.asp

das ganze soll mit PHP funktionieren! Und in der Schnittstellenbeschreibung steht des Weiteren noch, dass ich dem HTTP- Header Username und Passwort übergeben soll(UserName und Passwort sind andere als in der XML-Struktur):

Ausschnitt aus der Schnittstellenbeschreibung:(Passwort und UserName im Header)
This is done with the header field label "X-AUCTIONWORKS-API-VALIDATE" in the HTTP header. Use a semicolon to separate the user name and password values.


Ich würde mich über jede Art von Hilfe freuen. Falls ihr tutorials kennt könnt ihr sie mir posten oder falls ihr Codeschnipsel hab, könnt ihr dies ebenfalls tuen. Ich denke aber das nicht viel Code benötigt wird, dar es wahrscheinlich sehr simple ist
 
Ok, war das letzte mal einfach davon ausgegangen das es SOAP ist ,) nagut dann Ohne SOAP würde es hier so zB aussehen mit SimpleXML und cURL

PHP:
<?
/**
 * Stepp 1:
 * XML Sheet zusammenbauen
 */

$xml_start = '<?xml version="1.0"?><Request></Request>';
$xml = new SimpleXMLElement($xml_start);
$xml->addChild('UserName','smartuser');
$xml->addChild('Password','password');
$xml->addChild('Command','GetUser');

$xml_string = $xml->asXML();

/**
 * Stepp 2:
 * Request Senden
 */
// erzeuge einen neuen cURL-Handle
$ch = curl_init();

// setze die URL und andere Optionen
curl_setopt($ch, CURLOPT_URL, "http://api.marketworks.com/api/apiCall.asp");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Die Auth-Daten:
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');

// führe die Aktion aus und erhalte Antwort
$file = curl_exec($ch);

// hier mit $file arbeiten
// Am besten wieder mit Simple XML auseinander nehmen und Parsen
echo $file;

// schließe den cURL-Handle und gebe die Systemresourcen frei
curl_close($ch);
?>
 
OK, erstmal vielen Dank, dass du immer so schnell anwortest

Ich benutze Eclipse als Entwicklungsumgebung und die haut mir folgenden Fehler raus:

Fatal error: Unknown function: curl_init() in C:\Programme\xampp\htdocs\API\test.php on line 19

Hab was über cURL gelsen, muss man da vllt. noch was installieren? Bibliotheken oder so?
 
Zuletzt bearbeitet:
Ja cURL ist leider nicht überall verfügbar muss halt aktiviert worden sein... siehe php.net-> http://de.php.net/manual/de/ref.curl.php

Aber generell ist das eigentlich die beste umgebung um damit zu arbeiten, das Autentifizieren ist einfach, es gibt timeouts usw. Wenn du es einfach nachinstallieren kannst mach es, wenn nicht dann wirst du den Teil mit fsocket machen müssen.

PS: Mein Zend Studio kanns *g*
 
Das Skript hat mich auf jeden Fall schon mal weiter gebracht. Um der cUrl-Geschichte erstmal aus dem Weg zu gehen habe ich mir ne Testversion von Zend Studio gezogen.

Ich bekomme schon eine Antwort vom Server, jedoch nicht die gewünschte:

<?xml version="1.0" encoding="ISO-8859-1" ?>
- <Auctionworks>
- <Error>
- <Module>
- <![CDATA[ apiCall.asp
]]>
</Module>
<ErrorCode>1</ErrorCode>
- <Summary>
- <![CDATA[ XML Parse Error
]]>
</Summary>
- <Details>
<SystemErrorCode>-1072896680</SystemErrorCode>
- <Description>
- <![CDATA[ XML document must have a top level element.

]]>
</Description>
</Details>
- <Source>
- <![CDATA[ apiCall.asp
]]>
</Source>
- <Message>
- <![CDATA[ XML Parse Error
]]>
</Message>
</Error>
</Auctionworks>

Hängt es vllt. damit zusammen das man die Benutzerdaten in dem HTTP-Header anders angeben muss In der Schnittstellenbeschreibung ist von einem bestimmten lable die Rede:

This is done with the header field label "X-AUCTIONWORKS-API-VALIDATE" in the HTTP header. Use a semicolon to separate the user name and password values.
 
wenn es so wäre...wie könnte man das beheben.....?

in der Fehlerbeschreibung steht:

- <Details>
<SystemErrorCode>-1072896680</SystemErrorCode>
- <Description>
- <![CDATA[ XML document must have a top level element.

]]>
</Description>
</Details>

Ist mit top level vielleicht die Header Info gemeint, die er haben möchte!!
 
So habe jetzt den gespendeten Code etwas modifiziert(was hinzugefügt).

// setze die URL und andere Optionen
curl_setopt($ch, CURLOPT_URL, "http://api.marketworks.com/api/apiCall.asp");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_string);


// Die Auth-Daten:
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');

Nun kommt nur noch die Meldung:

The API user name and/or password are invalid.

aber die sollten stimmen jedoch, steht da noch was in der API-Beschreibung...ich denke das ist die letzte Hürde..

This is done with the header field label "X-AUCTIONWORKS-API-VALIDATE" in the HTTP header. Use a semicolon to separate the user name and password values.

Weiß jemand wie ich das einbaue....oder ob es schon damit eingebaut ist:

// Die Auth-Daten:
curl_setopt($ch, CURLOPT_USERPWD, 'UserName;XXX');


Vielen Dank an alle die helfen wollen(ohne euch wäre ich nicht soweit gekommen)!!
 
OK, an alle die mir geholfen haben oder an die, die selbst mal solch einProblem haben hier ist die Lösung:

<?

/**
* Stepp 1:
* XML Sheet zusammenbauen
*/
$xml_start = '<?xml version="1.0" encoding="ISO-8859-1" ?><Request></Request>';
$xml = new SimpleXMLElement($xml_start);
$xml->addChild('UserName','Mustermann');
$xml->addChild('Password','#PassWd'');
$xml->addChild('Command','GetUser'); <-------- beispielsweise

$xml_string = $xml->asXML();
echo $xml_string;
/**
* Stepp 2:
* Request Senden
*/
// erzeuge einen neuen cURL-Handle
$ch = curl_init();

// setze die URL und andere Optionen
curl_setopt($ch, CURLOPT_URL, "http://api.marketworks.com/api/apiCall.asp");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-AUCTIONWORKS-API-VALIDATE: Mustermann;PassWd')); <----- war bei mir nötig(API-Beschreibung)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_string);


// Die Auth-Daten:
curl_setopt($ch, CURLOPT_USERPWD, 'Mustermann;PassWd'); <--- war bei mir nicht nötig aber so wird gewöhnlich die Passwort abfrage geregelt

// führe die Aktion aus und erhalte Antwort
$file = curl_exec($ch);

// hier mit $file arbeiten
// Am besten wieder mit Simple XML auseinander nehmen und Parsen
echo $file;


// schließe den cURL-Handle und gebe die Systemresourcen frei
curl_close($ch);
?>


Vielen Dank vorallem an engelb
 
Zurück