Mit php header() post-daten übertragen...
Roland
- php
Hi!
Ich möchte Formulardaten an eine API übertragen, die Forumlardaten solln aber von PHP ausgefüllt werden, daher meine Frage, wie kann ich bei der Funktion header() Post-Daten übertragen.
lg
Roland
Hi,
Ich möchte Formulardaten an eine API übertragen, die Forumlardaten solln aber von PHP ausgefüllt werden, daher meine Frage, wie kann ich bei der Funktion header() Post-Daten übertragen.
Header schreibt, wie der Name schon sagt, header.
POST-Daten werden im body des Request übertragen.
cu,
Andreas
wie könnte ich es denn dann sonst realisieren?
danke
Roland
wie könnte ich es denn dann sonst realisieren?
Hallo Roland,
das Zauberwort heisst: CURL
http://de.php.net/manual/de/function.curl-setopt.php
Leider wird das sehr oft missbraucht für unangebrachte Handlungen, ich selber kam das erste Mal damit in Berührung, als ich für eine sogenannte Serverfarm gearbeitet habe, und dort ist es eine der wichtigsten Librarys.
Also bau keinen Mist damit!
Eh nicht, das wird eh nur nach einem klick eines Benutzers aufgerufen...
danke
Roland
Mit CURL kann ich Daten von einer Website auslesen, aber ich auf sie weiterleiten, passt also nicht :-/
lg
Roland
Mit CURL kann ich Daten von einer Website auslesen, aber ich auf sie weiterleiten, passt also nicht :-/
Da liegst du aber völlig daneben. Curl wird, wie bereits erwähnt, auch missbraucht, zum beispiel um sich Tausende von Bloagaccounts anzulegen, wo curl eben die komplette Anmelde und Weiterleitungsprozedur übernimmt.
Anmelden, Login, Bilder hochladen, News eintragen, etc....
Paul
Aso, und wie könnte ich das denn mit Curl realisieren?
lg
Roland
Hello Roland,
einigermaßen erklärt wird es hier:
http://www.php-faq.de/q/q-code-post.html
<?php #### post2host.php ####
function post2host($host, $path, $referer, $data_to_send)
{
$fp = fsockopen($host, 80);
# printf("Open!\n");
fputs($fp, "POST $path HTTP/1.1\n");
fputs($fp, "Host: $host\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: ". strlen($data_to_send) ."\n");
fputs($fp, "Connection: close\n\n");
fputs($fp, "$data_to_send\n");
# printf("Sent!\n");
while(!feof($fp))
{
$res .= fread($fp, 128);
}
# printf("Done!\n");
fclose($fp);
return $res;
}
$data = "pid=14&poll_vote_number=2";
#printf("Go!\n");
$x = PostToHost(
"www.linux.com",
"/polls/index.phtml",
"http://www.linux.com/polls/index.phtml?pid=14",
$data
);
?>
Ausgaben auf die Standardausgabe haben innerhalb einer Funktion nichts zu suchen.
Ich bin mir nicht ganz klar darüber, ob man zum Senden der Daten nicht auch eine Schleife bauen müsste, die immer nur blockweise sendet, oder ob PHP das hier schon alleine schafft.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hello,
das gepostete Beispiel ist allerdings noch nicht einmal die Hälfte der Miete.
Denn wenn man es "richtig" machen will, sollte man vor einem größeren Post erstmal einen HEAD-Request absenden, ob die Ressource überhaupt noch unter der URL erreichbar ist. Dies müsste man dann solange fortsetzen, wie ein Redirect zurückkommt bzw. bis ein Status 200 zurückkomt.
Dann erst den eigentlichen Post absetzen an die resultierende URL.
Sonst schickt man nutzlos Daten durch das netzt, ohne wissen zu können, ob sie überhaupt eine Chance haben, beim gewünschten Ziel anzukommen.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Denn wenn man es "richtig" machen will, sollte man vor einem größeren Post erstmal einen HEAD-Request absenden, ob die Ressource überhaupt noch unter der URL erreichbar ist. Dies müsste man dann solange fortsetzen, wie ein Redirect zurückkommt bzw. bis ein Status 200 zurückkomt.
Sowas könnte schon fast DDoS sein...
Sonst schickt man nutzlos Daten durch das netzt, ohne wissen zu können, ob sie überhaupt eine Chance haben, beim gewünschten Ziel anzukommen.
M.E. verursacht ein HEAD-Request nebst Response plus POST-Request nebst Response mehr sinnlosen Traffic als gleich ein POST-Request. Sollte die Ressource nicht verfügbar sein, gibt's eine Fehlermeldung und gut.
Siechfred
Hello,
M.E. verursacht ein HEAD-Request nebst Response plus POST-Request nebst Response mehr sinnlosen Traffic als gleich ein POST-Request. Sollte die Ressource nicht verfügbar sein, gibt's eine Fehlermeldung und gut.
Das interessiert mich nun wirklich, ob man das File mit einigen Megabyte nun wirklich gleich anhängen sollte, oder doch erstmal prüfen, ob die Ressource noch vorhanden ist.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hi!
Ich erhalte folgenden Fehler :-/
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com/:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /[link.php] on line 754
thx
Roland
Hello Roland,
Ich erhalte folgenden Fehler :-/
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com/:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /[link.php] on line 754
Und hier bekomsmt Du den Status-Code "not suficiant input"...
OS?
PHP-Version und Implementation? (Modul, CGI, FastCGI)
Weberserver Typ und Version?
Provider?
PHP-Konfiguration? -> phpinfo() -> allow_url_fopen: ?
usw...
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
sry,
Linux mx1 2.6.16.1 #5 SMP PREEMPT Tue Apr 4 16:28:46 CEST 2006 i686
Server API: CGI/FastCGI
Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.7e DAV/2 mod_fastcgi/2.4.2
PHP Version 5.2.4
allow_url_fopen is on
Hello,
sry,
Ok
da muss ich aber auch erst mal basteln, um das nachzustellen...
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Ok, ich habs jetzt zum laufen gebraucht, hab auf folgendes geändert:
$fp = fsockopen($host, $port, $errno, $errstr, 30);
ich wollte damit aber auf die Seite weitergeleitet werden, nicht den Inhalt der Seite bei mir anzeigen können!
lg
Roland
Hi,
Ok, ich habs jetzt zum laufen gebraucht, hab auf folgendes geändert:
$fp = fsockopen($host, $port, $errno, $errstr, 30);ich wollte damit aber auf die Seite weitergeleitet werden, nicht den Inhalt der Seite bei mir anzeigen können!
Mit dem, was du derzeit machst, fordert dein PHP-Script Daten von irgendwoher an. Also ist es auch an deinem PHP-Script, diese ggf. anzuzeigen.
Es existiert keine mir bekannte sichere Moeglichkeit, POST-Daten per HTTP "weiterzuleiten".
Fuer alle 3xx-Statuscodes gilt die Praemisse:
The action required MAY be carried out by the user agent without interaction with the user if and only if the method used in the second request is GET or HEAD.
Zu 301 Moved Permanently merkt der RFC an:
Note: When automatically redirecting a POST request after
receiving a 301 status code, some existing HTTP/1.0 user agents
will erroneously change it into a GET request.
Ob das mit "zeitgemaessen" Clients unter Verwendung von HTTP/1.1 anders aussieht, muesste man testen.
302 Found sollte per Spezifikation zwar gehen, ist in der Praxis aber wohl auch untauglich:
Note: RFC 1945 and RFC 2068 specify that the client is not allowed
to change the method on the redirected request. However, most
existing user agent implementations treat 302 as if it were a 303
response, performing a GET on the Location field-value regardless
of the original request method. The status codes 303 and 307 have
been added for servers that wish to make unambiguously clear which
kind of reaction is expected of the client.
307 Temporary Redirect sollte ebenfalls die POST-Methode beibehalten (k.A., ob das zeitgemaesze Clients so umsetzen) - allerdings auch hier nicht ohne explizite Nachfrage an den Nutzer.
Das einzig halbwegs praxistaugliche waere m.E. eine "Weiterleitung" "per HTML" (und JavaScript):
PHP-Script baut HTML-Formular mit den benoetigten Daten in vorbelegten Feldern auf [1], versieht es mit der externen Zieladresse als action, liefert dieses an den Client aus - und laesst es dort per JavaScript automatisch abschicken.
[1] Geht natuerlich nicht fuer File-Uploads.
MfG ChrisB
Hi,
Ich erhalte folgenden Fehler :-/
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com/:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in /[link.php] on line 754
In dieser Meldung wird dir sogar explizit eine Frage gestellt - wieso beantwortest du sie nicht (bzw. fragst zunaechst den Serveradmin, der es koennen sollte)?
MfG ChrisB
weil das eben enabled ist ;)
Und ich dachte das es vielleicht am code liegt!
lg
Roland
Hello,
Noch ein Nachtrag:
einigermaßen erklärt wird es hier:
http://www.php-faq.de/q/q-code-post.html<?php #### post2host.php ####
function post2host($host, $path, $referer, $data_to_send, $port=80)
{
$fp = fsockopen($host, $port);
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, "$data_to_send\r\n");
while(!feof($fp))
{
$res .= fread($fp, 128);
}fclose($fp);
return $res;
}
Header müssen mit CRLF aabgeschlossen werden. PHP nutzt aber kein magisches "\n", sondern ein rein ersetzendes. Es muss also dediziert "\r\n" angegeben werden.
Außerdem sollte man bei größeren Datenmengen noch beachten, ob man nicht "chunked" übertragen muss, also mit Zeilenumbrüchen. Es fehlt auch ein Content transfer encoding.
Wenn man sich einen Requestheader anschauen will, hilft z.B. php://input als Kanal zum Auslesen.
http://forum.de.selfhtml.org/archiv/2006/10/t139327/#m904985
http://www.php.net/manual/en/wrappers.php.php
Bau Dir also ein Formular, fülle es aus mit Umlauten etc, und sende es dann an Deinen Testserver. Dann kannst Du es ansehen. Achte auf das Encoding der Daten.
Auch dafür ist der Head-Request ggf. gut, um herauszufinden, welche Codierung der Server haben will.
Wäre schön, wenn wir das hier mal fertig diskutieren könnten, wie so ein Request vollständig und sauber aufgebaut werden sollte.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hi,
Ich möchte Formulardaten an eine API übertragen, die Forumlardaten solln aber von PHP ausgefüllt werden, daher meine Frage, wie kann ich bei der Funktion header() Post-Daten übertragen.
Vielleicht machst du dir erst mal den Unterschied zwischen Request und Response klar.
MfG ChrisB
Ich kenn den Unterschied!
Das mit der API ist nicht ganz richtig, eigentlich wäre es ein Formular, das man auf der Website einbauen soll, ich will aber das die Daten nicht vom benutzer eingegeben werden müssen, sondern aus einer db kommen, daher der Wunsch $_POST mit PHP beim weiterleiten auf eine andere Website mitzuschicken...
Ich bin bei den andren Antworten aber schon fündig geworden (
Tom vom Berg).
lg
Roland