Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Datentransfer mittels PHP über eine XML-Schnittstelle [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-consult PHP Entwicklung
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Datentransfer mittels PHP über eine XML-Schnittstelle


 
raz667
19-03-2008, 11:28 
 
Hallo zusammen,

ich bin damit beauftragt, ein Skript zuschreiben (vorzugsweise in PHP) welches XML Daten an einen Server senden und als Antwort ebenfalls XML Daten empfangen soll.

Da das für mich absolutes Neuland ist und ich bisher noch nie in die Verlegenheit kam, zwei Server miteinander interagieren zu lassen, tu ich mich auch im Moment richtig schwer, einen Ansatz für dieses Problem zu finden.

Für den Server, mit dem interagiert werden soll, gibt es einen Testlink.
Dieser lautet wie folgt: http://217.110.90.105/elvia/booking/crs.nsf/RSHPMAIN?OpenAgent

Mein erstes (und sicher nicht letztes) Problem ist es schon, eine Verbindung mittels PHP zu diesem Server aufzubauen. Ich habe folgenden Ansatz gewählt:


$fp = fsockopen("http://217.110.90.105/elvia/booking/crs.nsf/RSHPMAIN?OpenAgent", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: http://217.110.90.105/elvia/booking/crs.nsf/RSHPMAIN?OpenAgent\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}


Wenn ich dieses Skript dann aufrufe, bricht dieses mit dem Fehlercode 0 ab.
Verbinde ich jedoch via curl (ohne irgendwelche Daten zu übergeben) zu diesem Server, bekomme ich eine Antwort.

Könnt Ihr mir sagen, woran das liegt? Ist PHP vielleicht nicht das geeignete Mittel?
Ich bin für jeden Tipp dankbar!

Gruß,
raz667

 
asp2php
19-03-2008, 11:37 
 
fsockopen erwartet nur den Host, die URL-Parameter musst du in GET Anforderung angeben. Lese mal die User Contributed Notes http://de2.php.net/manual/en/function.fsockopen.php

 
raz667
19-03-2008, 11:43 
 
Hi,

danke für deine Antwort!
Aber leider hilft mir das nicht sehr viel weiter. Wie gesagt, arbeite ich zum ersten Mal mit Verbindungen zu anderen Servern, also auch mit der Funktion fsockopen().

Da mir im Moment der Überblick fehlt, fällt es mir auch schwer aus den User Contribute Notes schlau zu werden, sind die mir doch noch ein wenig zu spezifisch und gefüttert mit Infos die mich nur noch weiter verwirren.

Ist es möglich, mir kurz zu beschreiben, wie ich die XML Daten als GET anforder bzw. kennst du ein Tutorial was sich zufällig genau mit dieser Thematik auseinandersetzt?

Das würde mir schwer helfen!

Danke,
raz

 
asp2php
19-03-2008, 11:46 
 
Ähm ... alle meine Erfahrungen habe ich fast nur aus der Doku und die dazugehörige User Contributed Notes sowie eigene Try 'n Error. Daher kann ich dir leider nichts anderes anbieten.

Was ist denn so schwer daran? OK, die meisten Bsp. sind POST und HEAD, aber daran kann es doch nicht liegen, oder?

 
Manko10
19-03-2008, 16:12 
 
Hi,

ehrlich gesagt habe ich auch nicht allzu große Erfahrungen mit Socket-Verbindungen via PHP, da es wohl eher zu den Randthematiken gehört.
Jedoch habe ich mal eine Update-Funktion zusammengebastelt, die ich dir hier einfach mal poste:
<?php
function update_app() {
$url = parse_url("http://www.example.com/bla.xml");
if (!isset($url['port'])) {
$url['port'] = 80;
}
$url['query'] = '';
$url['protocol'] = $url['scheme'].'://';
$eol = "\r\n";

$headers = "POST ".$url['protocol'].$url['host'].$url['path']." HTTP/1.0".$eol.
"Host: ".$url['host'].$eol.
"Referer: ".$url['protocol'].$url['host'].$url['path'].$eol.
"Content-Type: application/x-www-form-urlencoded".$eol.
"Content-Length: ".strlen($url['query']).$eol.$eol.$url['query'];

$file = @fsockopen($url['host'], $url['port'], $errno, $errstr, 30);
if ($file) {
fputs($file, $headers);
$result = '';
while (!feof($file)) {
$result .= fgets($file, 500);
}
fclose($file);

if (!stristr($result, '200 OK')) {
return false;
}

$result = preg_replace('#^.*\r\n\r\n#s', '', $result);
return simplexml_load_string($result);
} else {
return false;
}
}
?>
Das ganze verbindet zu einem Server und holt XML-Daten. Danach werden die HTTP-Header entfernt und das ganze als SimpleXML-Resource zurückgegeben.

Ich hoffe mal, du kannst das für dich umbauen. Um Daten zu senden, verwendest du dann statt fputs() fwrite().

 
PHP-Desaster
19-03-2008, 18:14 
 
Überlass einer HttpClient-Klasse die Drecksarbeit mit dem Socket. Die von Incutio (http://scripts.incutio.com/httpclient/) ist ganz ok!

 
Quetschi
20-03-2008, 11:43 
 
Curl (http://de3.php.net/curl) ? :dontknow:

BTW:
Eigentlich kein Xml-Problem -> falsches Forum :confused:

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:45 Uhr.