Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Winsock HTTP Post (https://www.delphipraxis.net/166541-winsock-http-post.html)

jokerfacehro 17. Feb 2012 13:40


Winsock HTTP Post
 
Hallo,

ich nutze die WinSock-API für HTTP-Anfragen.

GET-Anfragen und das Empfangen der Daten funktioniert wunderbar.

Einziges Problem ist das POST.
Die übergebenen Variablen werden vom PHP-Script nicht erkannt bzw. nicht übergeben.


Ich sende in folgender Form meine Daten:


Code:
$header = "POST /testserver/index.php HTTP/1.1 \r\n"
         ."Host: localhost \r\n"
       ."Connection: Close \r\n"
       ."User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 \r\n"
       ."Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \r\n"
       ."Content-Type: application/x-www-form-url-encoded"
       ."Content-Length: 8 \r\n\r\n"
       ."a=blabla";
Delphi-Quellcode:
const
  Post = 'POST <FILEPATH> HTTP/1.0'+#13#10+
             'Host: <HOSTNAME>'+#13#10+
             'Content-Type: <CONTENTTYPE>'+#13#10+
             'Content-Length: <CONTENTLENGTH>'+#13#10+
             'Connection: Close'+#13#10+#13#10+
             'a=parameter&b=bla';


Benutze ich ein HTML-Post-Form reagiert meine PHP-Seite wie gewollt.
Doch schicke ich meinen Post, bekomme ich die Antwort, dass die Variable
"Notice: Undefined index: a in C:\xampp\htdocs\testserver\index.php on line 2" usw.
nicht vorhanden sind.

Ich habe mit Wireshark mir die gesendeten Header angeschaut und sehe keine relevanten Unterschiede.
Meine Send-Methode überträgt auch alle Daten und die Antwort kommt auch (halt mit PHP-Error drin).

Desweiteren habe ich per fsockopen das gleiche mit PHP ausprobiert und es kommt genau dasselbe bei raus.

Sieht jemand den Fehler (vielleicht in meinem Header) ?


Grüße :D

wicht 17. Feb 2012 14:06

AW: Winsock HTTP Post
 
Hi,

der wirklich gesendete Header wäre vielleicht hilfreicher, als die Vorlage aus dem Quelltext. Da sehe ich erstmal keinen Fehler...

jokerfacehro 17. Feb 2012 14:16

AW: Winsock HTTP Post
 
Der PHP-string sieht genauso aus, wie oben beschrieben.

Bei wireshark geht der auch genauso durch.

Hier nochmal die Delphiversion mit eingesetzten werten:

Delphi-Quellcode:

Post = 'POST /testserver/ HTTP/1.1'+#13#10+
             'Host: localhost'+#13#10+
             'Content-Type: application/x-www-form-url-encoded'+#13#10+
             'Content-Length: 8'+#13#10+
             'Connection: Close'+#13#10+#13#10+
             'a=blabla';

An einer fehlerhaften Content-Length liegt es auf jedenfall nicht.

shmia 17. Feb 2012 14:59

AW: Winsock HTTP Post
 
Zitat:

Zitat von jokerfacehro (Beitrag 1151632)
ich nutze die WinSock-API für HTTP-Anfragen.

Das wäre mir viel zu "Low-Level".
Ich verwende meistens das Interface IXMLHTTPRequest von Microsft.
http://www.delphipraxis.net/94462-http-ueber-msxml.html
Da werden einem viele Dinge (HTTP & HTTPS Protokollebene, Proxyserver) abgenommen.
Ich habe dazu auch noch Demos auf meim Rechner; bei Interesse einfach Bescheid sagen.

jokerfacehro 17. Feb 2012 15:09

AW: Winsock HTTP Post
 
Das hat schon alles seinen Sinn mit WinSock :)

Ich hätte auch IdHTTP nehmen können, aber darum geht es nicht.

Edit: so sieht das script zur abfrage aus, in der index.php wird dann einfach ein

Delphi-Quellcode:
<?
echo $_POST['a'];
?>
aufgerufen



Delphi-Quellcode:
<?php

$sock = fsockopen( "localhost", 80, $errno, $erro, 2);

$header = "POST /testserver/index.php HTTP/1.1 \r\n"
         ."Host: localhost \r\n"
      // ."Connection: Close \r\n"
       ."User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 \r\n"
       ."Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \r\n"
       ."Content-Type: application/x-www-form-url-encoded"
       ."Content-Length: 8 \r\n\r\n"
       ."a=blabla&b=dsfdf&a=whjdbwdj";
       
fwrite( $sock, $header);
$data = $header;

while(!feof($sock)) {
$data .= fread( $sock, 128);
}

fclose($sock);

$data = str_replace( "\r\n", "<br>", $data);
echo $data;

?>

shmia 17. Feb 2012 16:15

AW: Winsock HTTP Post
 
Zitat:

Zitat von jokerfacehro (Beitrag 1151644)
Das hat schon alles seinen Sinn mit WinSock :)

Du könntest diesen Sinn ja mit ein oder zwei Sätzen erklären.
Aber wozu das Rad nochmals erfinden?
In deinen Beispiel letzten Beispiel ist übrigens der Content-Length falsch.

jokerfacehro 20. Feb 2012 11:39

AW: Winsock HTTP Post
 
Ich habe den Fehler gefunden !!!!!!!!!!!!!!!!!

Falsch: ."Content-Type: application/x-www-form-url-encoded"

Richtig: ."Content-Type: application/x-www-form-urlencoded"


Jetzt läuft's


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz