| Autor |
Beitrag |
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 19.10.09 17:50
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mo 19.10.09 19:17
ich hatte gar keine methode...ich hab die einfach von hand eingebaut.
mfg
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 19.10.09 19:24
the-kecks hat folgendes geschrieben : | | ich hatte gar keine methode...ich hab die einfach von hand eingebaut. |
Dann zeig doch bitte schön den Quelltext, den du so schön von Hand geschrieben hast... so kommen wir doch nicht weiter!
Edit: Oh, sorry - ich dachte, du hättest die Methode von Hand eingebaut, dabei waren es wahrscheinlich die Zeichen, oder?
Hm, das hieße dann ja, dass das IdHTTP die encodierten Zeichen umwandelt. Wäre aber sehr seltsam. Hast du jetzt mal die von mir oben verlinkte Seite als Ziel ausprobiert? Wenn ja, was zeigt die für POST-Daten an?
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mo 19.10.09 19:33
ja, hab die zeichen von hand eingebaut.
deine seite hab ich probiert, hab daten an server geschickt (HTMLCOde:=IdHTTP1.Post(Link, '%20%26%20')
HTMLCode zeigte aber nur den normalen quelltext an (hab ich was falsch gemacht?). Daraufhin habe ich es dann hier im forum versucht
mfg
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 19.10.09 20:24
the-kecks hat folgendes geschrieben : | Delphi-Quelltext 1:
| HTMLCOde:=IdHTTP1.Post(Link, '%20%26%20'); | |
Das läuft doch nichtmal durch den Compiler durch, wieso postest es dann hier? (Oder ist bei dir als zweiter Parameter ein String möglich?)
Ich hab das ganze jetzt mal nachgestellt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| function HTTPEncode(const AStr: string): string; const NoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-']; var Sp, Rp: PChar; begin SetLength(Result, Length(AStr) * 3); Sp := PChar(AStr); Rp := PChar(Result); while Sp^ <> #0 do begin if Sp^ in NoConversion then Rp^ := Sp^ else if Sp^ = ' ' then Rp^ := '+' else begin FormatBuf(Rp^, 3, '%%%.2x', 6, [Ord(Sp^)]); Inc(Rp, 2); end; Inc(Rp); Inc(Sp); end; SetLength(Result, Rp - PChar(Result)); end;
procedure TForm1.FormCreate(Sender: TObject); var HTTP: TIdHTTP; Response: String; Data: TStringList;
procedure AddData(Name, Value: String); begin Data.Values[HTTPEncode(Name)] := HTTPEncode(Value); end;
begin Data := TStringList.Create; HTTP := TIdHTTP.Create; try AddData('url', 'http://example.com/test?blah=blubb&foo=bar'); AddData('color', 'red');
HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; Response := HTTP.Post('http://yogu.bplaced.net/post.php', Data);
inpOutput.Lines.Text := Response; finally FreeAndNil(HTTP); FreeAndNil(Data); end; end; |
Die Funktion HTTPEncode habe ich von tutorials.de.
Dieses Programm macht folgende Ausgabe:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| <?xml version="1.0" encoding="iso-8859-1" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>POST</title> </head> <body> <h1>POST Data</h1> <ul> <li><b>url:</b> http%3A%2F%2Fexample.com%2Ftest%3Fblah%3Dblubb%26foo%3Dbar</li> <li><b>color:</b> red</li> </ul> </body> </html> |
Seltsam ist, dass die encodierten Zeichen nicht vom Server in Sonderzeichen umgewandelt werden. Mein Script würde HTML-eigene Zeichen, also auch das kaufmännische Und (&), in z.B. &: umwandeln. Hier ist aber die %-Codierung noch vorhanden, was mich ziemlich verwirrt. Aber auf jeden Fall werden beide Parameter mit übergeben, und das ist ja dein Hauptanliegen.
URLS sollten übrigens sowieso in dieser %-Schreibweise bleiben, aber darum sollte sich das Forum kümmern.
Grüße,
Yogu
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mo 19.10.09 21:03
erstmal danke für deine mühe mit diesem post
ich hatte den orignal code nicht mehr mit dem ich es ausprobiert hatte, daher hab ich schnell was hingeschrieben^^
mein hauptanliegen ist eigentlich, dass die postdaten nicht abgeschnitten werden und dass das & korrekt dargestellt wird.
mfg
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 19.10.09 21:45
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mo 19.10.09 22:35
ich hab es ja ausprobiert und es klappt auch, aber der link ist dann ....%26.../ und den öffnet der browser nicht
mfg
|
|
LexXis
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Di 20.10.09 00:55
Welchen Browser verwendest du denn? Firefox 3.5.3 macht da in meinem Fall brav ein '&' in der URL draus
Kurz zu meinem Lösungsansatz (sollte selbsterklärend sein)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| function TForm1.EncodeURL(F: String): String; var i: Integer; begin Result := '';
for i := 1 to Length(F) do if not (F[i] in ['a'..'z', 'A'..'Z', '0'..'9', '.']) then Result := Result + '%' + IntToHex(Ord(F[i]), 2) else Result := Result + F[i]; end;
procedure TForm1.Button1Click(Sender: TObject); var Post: TStringStream; PostStr: String; begin PostStr := 'url='+EncodeURL('http://www.delphi-forum.de/viewtopic.php?'+ 't=95398&start=0&postorder=asc'); Post := TStringStream.Create(PostStr); IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded'; ShowMessage(IdHTTP1.Post('http://127.0.0.1/', Post)); Post.Free; end; |
Hab das ganze wie gesagt nur lokal mit xamplite getestet. In meiner Index.php steht daher auch ganz banal nur
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| <?PHP if( isset($_POST['url']) ) { echo '<a href="' . $_POST['url'] . '">' . $_POST['url'] . '</a>'; } ?>
<form action="http://127.0.0.1/" method="post"> <input type="text" name="url" /><input type="submit" /> </form> |
Apache serviert mir daraufhin wie gewünscht einen Link mit dem gewünschten Ziel.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Di 20.10.09 21:45
ich benutze firefox 3.5.3 und es geht trotzdem nicht...
code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function EncodeURL(F: String): String; var i: Integer; begin Result := '';
for i := 1 to Length(F) do if not (F[i] in ['a'..'z', 'A'..'Z', '0'..'9', '.']) then Result := Result + '%' + IntToHex(Ord(F[i]), 2) else Result := Result + F[i]; end;
procedure TForm1.Button1Click(Sender: TObject); var Params : TStringlist; begin Params := TStringlist.Create; Params.Add('url=' + EncodeURL('hallo&hallo')); Params.Add('url2=hallo'); Memo1.Text:=IdHTTP1.Post('http://yogu.bplaced.net/post.php', Params); |
yogu.bplaced.net quelltext:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| <?xml version="1.0" encoding="iso-8859-1" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>POST</title> </head> <body> <h1>POST Data</h1> <ul> <li><b>url:</b> hallo%26hallo</li> <li><b>url2:</b> hallo</li> </ul> </body> </html> |
mfg
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 20.10.09 22:31
Hm, ok, so sah es bei mir auch aus. Wenn du die URL jetzt aber noch in <a></a>-Tags (bzw. in entsprechende BB-Codes) packst, sollte der Browser den Link richtig darstellen und aufrufen.
Bei URLS sind solche %er-Escapes gültig, in HTML nicht. Irgendwie müsste man es hinbekommen, dass der Server die POST-Daten direkt umsetzt. Dafür ist eigentlich folgende Zeile zuständig:
Yogu hat folgendes geschrieben : | Delphi-Quelltext 42:
| { ... } HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; | |
Vielleicht weiß jemand anderes, was hier schief läuft. Ich jedenfalls nicht.
|
|