php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 1,00 durchschnittlich.
Alt 09.09.2008, 19:26  
Neuer Benutzer
 
Registriert seit: 09.09.2008
Beiträge: 9
DenMa befindet sich auf einem aufstrebenden Ast
Standard XML/API Schnittstelle mit PHP ansprechen

Guten Abend zusammen,

ich habe da ein kleines Problem .
Und zwar möchte ich folgendes realisieren:

- einen content (XML) an eine API-Schnittstell bei Afterbuy schicken
- den response in eine Datei speichern und anschließend
- die Informationen aufbereiten und in Datenbanken eintragen.

Das ganze in zwei Richtungen.

Mein Problem:
Ich finde keinen Anfang.
Was muss ich in PHP machen, damit ich z. B. folgenden Code
Code:
<?xml version="1.0" encoding="utf-8"?>
<Request>
  ---- Globale Tags
  <AfterbuyGlobal>
    <PartnerID> Integer </PartnerID>
    <PartnerPassword> String </PartnerPassword>
    <UserID> String </UserID>
    <UserPassword> String </UserPassword>
    <CallName> String </CallName>
    <DetailLevel> Integer </DetailLevel>
    <ErrorLanguage> String </ErrorLanguage>
  </AfterbuyGlobal>
</Request> 
An die Adresse:
https://www.afterbuy.de/afterbuy/ABInterface.aspx

schicken kann und das Ergebnis
Code:
<?xml version="1.0" encoding="UTF-8"?>
<Afterbuy>
    <CallStatus> String </CallStatus>
    <CallName> String </CallName>
    <Result>
      <AfterbuyTimeStamp> Date </AfterbuyTimeStamp>
      <AfterbuyUniversalTimeStamp> Date </AfterbuyUniversalTimeStamp>
    </Result>
</Afterbuy>
 
in die Datei
temp_result.dat
speichern kann.

Denn Rest, die Information aufzubereiten und in Datenbanken einzutragen und auszuwerten ist kein Problem.

Nur die Schnittstelle anzusprechen, da verzweifel ich wirklich dran.

Ich wäre für Hilfe sehr Dankbar.

Vielen Dank für eure Aufmerksamkeit.
DenMa ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.09.2008, 22:53  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 993
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Wozu zwischenspeichern? das ist unnötig!

PHP-Code:
<?php
interface iApi {
    public function 
__construct();
    public function 
connect($ip);
    public function 
sendRequest($request);
    public function 
getResponse();
    public function 
__destruct();
}
class 
Api implements iApi {
    protected 
$stream;
    public function 
__construct() {
        
$this->stream null;
    }
    public function 
connect($ip) {
        
$this->stream = @fsockopen($ip80);
        if(
$this->stream === false) {
            
trigger_error("connection failed"E_USER_ERROR);
        }
    }
    public function 
sendRequest($request) {
        return (bool) @
fwrite($this->stream$requeststrlen($request));
    }
    public function 
getResponse() {
        
$contents "";
        do {
              
$contents .= @fread($this->stream8192);
        } while (!
feof($this->stream));
        return 
$contents;
    }
    public function 
__destruct() {
        @
fclose($this->stream);
    }
}

$api = new Api();
$api->connect("https://www.afterbuy.de/afterbuy/ABInterface.aspx");
$request '
<?xml version="1.0" encoding="utf-8"?>
<Request>
  ---- Globale Tags
  <AfterbuyGlobal>
    <PartnerID> Integer </PartnerID>
    <PartnerPassword> String </PartnerPassword>
    <UserID> String </UserID>
    <UserPassword> String </UserPassword>
    <CallName> String </CallName>
    <DetailLevel> Integer </DetailLevel>
    <ErrorLanguage> String </ErrorLanguage>
  </AfterbuyGlobal>
</Request>
'
;
$api->sendRequest($request);
$response $api->getResponse();
$xml simplexml_load_string($response);
echo 
"<pre>";
var_dump($xml);
echo 
"</pre>";
?>
Ich gehe aber davon aus, dass du hier wahrscheinlich noch ein pack() und ein unpack() benutzten musst, entweder im Format "Va*" oder wenn du noch ein handler benutzen musst "VVa*" oder so ähnlich
__________________
Frank ist offline   Mit Zitat antworten
Alt 10.09.2008, 10:15  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Und dann würde ich noch etwas um die Struktur der XML Nachrichten legen.
Also zum Beispiel
Zitat:
<PartnerID> Integer </PartnerID>
<PartnerPassword> String </PartnerPassword>
wirst Du wohl immer senden (oder durch ein Token ersetzen) müssen. Das
Zitat:
<CallStatus> String </CallStatus>
<CallName> String </CallName>
<Result>
nehme ich mal an, wird auch bei jedem Aufruf so sein. usw. usw.

Und dann ist da noch die Frage, wie die Transportschicht genau aussieht. Die Methode von Frank (socket auf, reinkippen, abholen bis das socket beendet wird) ist ...möglich. Es könnte sich aber auch um HTTP/POST handeln. Du da ist dann die Frage, wie der Request genau aufgebaut sein soll. Oder es ist noch etwas ganz anderes...

Gibt es zur Schnittstelle öffentlich einsehbare Dokumentation?
David ist offline   Mit Zitat antworten
Alt 10.09.2008, 11:51  
Neuer Benutzer
 
Registriert seit: 09.09.2008
Beiträge: 9
DenMa befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für die schnellen Antworten.

Leider kommt folgende Fehlermeldung:

Parse error: syntax error, unexpected T_STRING in /var/www/virtual/denma.de/ebay/htdocs/api/api_ab_test.php on line 2

Woran kann das liegen?

@David
ja die gibt es unter: http://xmldoku.afterbuy.de/dokued/

Vielen Dank für eure Hilfe.

MFG

Geändert von DenMa (10.09.2008 um 12:01 Uhr).
DenMa ist offline   Mit Zitat antworten
Alt 10.09.2008, 12:29  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

PHP-Code:
<?php
foreach( array('PHP_VERSION''PHP_SAPI''PHP_OS') as $d ) {
  echo 
$d': 'constant($d), "<br />\n";
}
echo 
'allow_url_fopen: 'ini_get('allow_url_fopen'), "<br />\n";
if (
function_exists('stream_get_wrappers')) {    
    echo 
'wrappers: 'join(', 'stream_get_wrappers()), "<br />\n"
}
flush();

echo 
"extensions:<br />\n";
foreach(
array_chunk(get_loaded_extensions(), 4) as $d) {
  echo 
join(', '$d), "<br />\n";
}
echo 
date('H:i:s d.m.Y');
Was gibt das bei Dir aus?
David ist offline   Mit Zitat antworten
Alt 10.09.2008, 15:30  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 993
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Habe mir mal die Doku angeschaut und dementsprechend für die Erste methode eine Klasse gebaut (erste Methode war getAfterbuyTime)

Du kannst die so eigentlich immer erweitern mit den Methoden die du brauchst, kannst ja meine Methode als "Vorlage" nehmen
PHP-Code:
    public function getAfterbuyTime() {
        
$xml $this->_createGlobal("GetAfterbuyTime"0);
        
$response $this->_makeCall($xml->asXml());
        
$afterbuyTimeStamp = (string) $response->Result->AfterbuyTimeStamp;
        
$afterbuyUniversalTimeStamp = (string) $response->Result->AfterbuyUniversalTimeStamp;
        return array(
$afterbuyTimeStamp$afterbuyUniversalTimeStamp);
    } 
Die musst du halt dann kopieren und an die Anforderungen der anderen Aufrufe anpassen.

Hier mal die ganze klasse inklusive der Methode für GetAfterbuyTime
PHP-Code:
<?php
error_reporting
(E_ALL|E_STRICT);
interface 
iAfterbuyApi {
    public function 
__construct();
    public function 
setParams($address$partnerId$partnerPw$userId$userPw$language);
    public function 
getAfterbuyTime();
}
final class 
AfterbuyApi implements iAfterbuyApi {
    protected 
$address;
    protected 
$partnerId;
    protected 
$partnerPw;
    protected 
$userId;
    protected 
$userPw;
    protected 
$language;
    protected 
$rawXml;
    public function 
__construct() {
        
$this->address null;
        
$this->partnerId null;
        
$this->partnerPw null;
        
$this->userId null;
        
$this->userPw null;
        
$this->language null;
        
$this->rawXml "<?xml version=\"1.0\" encoding=\"utf-8\"?><Request></Request>";
    }
    public function 
setParams($address$partnerId$partnerPw$userId$userPw$language) {
        
$this->address $address;
        
$this->partnerId $this->_toUtf($partnerId);
        
$this->partnerPw $this->_toUtf($partnerPw);
        
$this->userId $this->_toUtf($userId);
        
$this->userPw $this->_toUtf($userPw);
        
$this->language strtoupper($language);
        return 
true;
    }
    public function 
getAfterbuyTime() {
        
$xml $this->_createGlobal("GetAfterbuyTime"0);
        
$response $this->_makeCall($xml->asXml());
        
$afterbuyTimeStamp = (string) $response->Result->AfterbuyTimeStamp;
        
$afterbuyUniversalTimeStamp = (string) $response->Result->AfterbuyUniversalTimeStamp;
        return array(
$afterbuyTimeStamp$afterbuyUniversalTimeStamp);
    }
    private function 
_makeCall($xml) {
        
$context $this->_createContext($xml);
        
$stream fopen($this->address"r"false$context);
        
$contents stream_get_contents($stream);
        
fclose($stream);
        
$response simplexml_load_string($contents);
        if (
$response->CallStatus == "Error") {
            
$this->_throwError($response);
            exit();
        }
        if (
$response->CallStatus == "Warning") {
            
$this->_throwWarning($response);
        }
        return 
$response;
    }
    private function 
_createGlobal($call$detail) {
        
$xml = new SimpleXMLElement($this->rawXml);
        
$xml->addChild("AfterbuyGlobal");
        
$xml->AfterbuyGlobal->addChild("PartnerID"$this->partnerId);
        
$xml->AfterbuyGlobal->addChild("PartnerPassword"$this->partnerPw);
        
$xml->AfterbuyGlobal->addChild("UserID"$this->userId);
        
$xml->AfterbuyGlobal->addChild("UserPassword"$this->userPw);
        
$xml->AfterbuyGlobal->addChild("CallName"$call);
        
$xml->AfterbuyGlobal->addChild("DetailLevel"$detail);
        
$xml->AfterbuyGlobal->addChild("ErrorLanguage"$this->language);
        return 
$xml;
    }
    private function 
_createContext($data) {
        
$context = array ();
        
$context["http"] = array();
        
$context["http"]["method"] = "POST";
        
$context["http"]["header"] = "Content-type: application/x-www-form-urlencoded\r\n";
        
$context["http"]["header"].= "Content-Length: ".mb_strlen($data)."\r\n";
        
$context["http"]["content"] = $data;
        
$context stream_context_create($context);
        return 
$context;
    }
    private function 
_toUtf($content) {
        return 
mb_convert_encoding($content"UTF-8""auto");
    }
    private function 
_toAscii($content) {
        return 
mb_convert_encoding($content"ASCII""UTF-8");
    }
    private function 
_throwError($response) {
        
$code = (int) $response->Result->ErrorList->Error->ErrorCode;
        
$desc = (string) $this->_toAscii($response->Result->ErrorList->Error->ErrorDescription);
        
$long = (string) $this->_toAscii($response->Result->ErrorList->Error->ErrorLongDescription);
        if(
PHP_SAPI == "cli") {
            
$error "Fatal Error\nCode:\t\t".$code."\nDescription:\t".$desc."\nDetails:\t".$long;
        }
        else {
            
$error "<table>\n\t<tr>\n\t\t<th colspan=\"2\">Fatal Error</th>\n\t</tr>\n";
            
$error.= "\t<tr>\n\t\t<td>Code:</td>\n\t\t<td>".$code."</td>\n\t</tr>\n";
            
$error.= "\t<tr>\n\t\t<td>Description</td>\n\t\t<td>".$desc."</td>\n\t</tr>\n";
            
$error.= "\t<tr>\n\t\t<td>Details:</td>\n\t\t<td>".$long."</td>\n\t</tr>\n</table>";
        }
        
trigger_error($errorE_USER_ERROR);
    }
    private function 
_throwWarning($response) {
        
$code = (int) $response->Result->WarningList->Warning->WarningCode;
        
$desc = (string) $this->_toAscii($response->Result->WarningList->Warning->WarningDescription);
        
$long = (string) $this->_toAscii($response->Result->WarningList->Warning->WarningLongDescription);
        if(
PHP_SAPI == "cli") {
            
$error "Warning\nCode:\t\t".$code."\nDescription:\t".$desc."\nDetails:\t".$long;
        }
        else {
            
$error "<table>\n\t<tr>\n\t\t<th colspan=\"2\">Warning</th>\n\t</tr>\n";
            
$error.= "\t<tr>\n\t\t<td>Code:</td>\n\t\t<td>".$code."</td>\n\t</tr>\n";
            
$error.= "\t<tr>\n\t\t<td>Description</td>\n\t\t<td>".$desc."</td>\n\t</tr>\n";
            
$error.= "\t<tr>\n\t\t<td>Details:</td>\n\t\t<td>".$long."</td>\n\t</tr>\n</table>";
        }
        
trigger_error($errorE_USER_WARNING);
    }
}

$api = new AfterbuyApi();
$api->setParams(
    
"https://www.afterbuy.de/afterbuy/ABInterface.aspx"
    
"PartnerId"
    
"PartnerPassword"
    
"UserId"
    
"UserPassword"
    
"de"
);
var_dump$api->getAfterbuyTime() );
?>
__________________

Geändert von Frank (10.09.2008 um 16:31 Uhr).
Frank ist offline   Mit Zitat antworten
Alt 10.09.2008, 16:24  
Neuer Benutzer
 
Registriert seit: 09.09.2008
Beiträge: 9
DenMa befindet sich auf einem aufstrebenden Ast
Standard

@ David

Ergebnis:
PHP_VERSION: 4.4.7-0.dotdeb.0
PHP_SAPI: apache2handler
PHP_OS: Linux
allow_url_fopen: 1
extensions:
zip, yp, xmlrpc, xml
wddx, tokenizer, sysvshm, sysvsem
sysvmsg, standard, sockets, shmop
session, posix, overload, mime_magic
mbstring, iconv, gettext, ftp
filepro, exif, dbx, dbase
dba, ctype, calendar, bz2
bcmath, zlib, pcre, openssl
apache2handler, mysql, gd, curl
domxml, imap, ldap, mcrypt
15:36:51 10.09.2008
DenMa ist offline   Mit Zitat antworten
Alt 10.09.2008, 17:13  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Und php4 ...daran ist nicht zu rütteln?
David ist offline   Mit Zitat antworten
Alt 10.09.2008, 17:14  
Neuer Benutzer
 
Registriert seit: 09.09.2008
Beiträge: 9
DenMa befindet sich auf einem aufstrebenden Ast
Standard

@David
auf nem 2ten Server kommt folgendes

PHP_VERSION: 5.2.6
PHP_SAPI: cgi-fcgi
PHP_OS: Linux
allow_url_fopen:
wrappers: php, file, data, http, ftp, compress.bzip2, compress.zlib, https, ftps, zip
extensions:
libxml, xml, wddx, tokenizer
sysvshm, sysvsem, sysvmsg, session
pcre, SimpleXML, sockets, SPL
shmop, standard, Reflection, readline
pspell, posix, pcntl, iconv
hash, gmp, gettext, ftp
filter, exif, date, curl
ctype, calendar, bz2, zlib
openssl, cgi-fcgi, bcmath, dbase
dom, gd, imap, json
mbstring, mysql, mysqli, odbc
PDO, pdo_mysql, PDO_ODBC, pdo_sqlite
soap, SQLite, xmlreader, xmlrpc
xmlwriter, xsl, zip, ionCube Loader
Zend Optimizer
17:13:58 10.09.2008
DenMa ist offline   Mit Zitat antworten
Alt 10.09.2008, 17:36  
Neuer Benutzer
 
Registriert seit: 09.09.2008
Beiträge: 9
DenMa befindet sich auf einem aufstrebenden Ast
Standard

ich habe auf dem PHP5 server nochmal url_fopen auf on gestellt.
mal schauen was nun passiert.

MFG
DenMa ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Schnittstelle zu TomTom Work Plague PHP Tipps 2008 0 20.06.2008 10:04
Java Server mit PHP ansprechen Broadcast PHP Tipps 2008 2 02.04.2008 16:34
Proxys mit Socks4 und 5 testen bzw. ansprechen? Frank Burian PHP-Fortgeschrittene 2 21.02.2007 19:40
Formular in Hauptfenster auf iframe ansprechen R.E.M. HTML, Usability und Barrierefreiheit 2 24.09.2006 15:33
Unsichtbares Formularfeld mit Javascript ansprechen mAy^daY HTML, Usability und Barrierefreiheit 6 13.08.2006 21:25
XML Schnittstelle -> keine Ausgabe PHP Tipps 2006 8 10.06.2006 13:19
Seite per ID ansprechen? tayke PHP Tipps 2006 4 01.06.2006 23:37
stty schnittstelle einstellen... hekto Server, Hosting und Workstations 2 24.04.2006 19:58
Serverseitige Schnittstelle zwischen Maileingang und MySQL webazubi PHP-Fortgeschrittene 8 26.02.2006 12:45
[Erledigt] Lesegerät ansprechen und Chipkarte auslesen PHP-Fortgeschrittene 5 21.02.2006 14:38
serielle schnittstelle und tcp schnurzli PHP-Fortgeschrittene 5 30.01.2006 15:01
Serielle Schnittstelle PHP-Fortgeschrittene 1 03.10.2005 22:02
leeren div-container ansprechen HTML, Usability und Barrierefreiheit 4 18.04.2005 11:04
AVM KEN als lokalen SMTP Server ansprechen workaholic PHP Tipps 2005 3 04.02.2005 13:20
[Erledigt] Schnittstelle? PHP-Fortgeschrittene 9 04.01.2005 14:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php xml request, xml request php, https://api.afterbuy.de/afterbuy/abinterface.aspx, ebay soap php, php request xml, php http request xml, http://www.php.de/php-fortgeschrittene/47317-xml-api-schnittstelle-mit-php-ansprechen.html, php xmlrequest, ebay api schnittstelle, error in loading string xml error is 2, xml request mit php, afterbuy xml doku, api schnittstelle ebay, php http xml request, xml doku afterbuy, php api ansprechen, api ansprechen, ebay xml api, php ebay schnittstelle, ebay schnittstelle php

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum