Entwickler-Ecke
Internet / Netzwerk - Http-Request
elron - Sa 19.11.05 14:15
Titel: Http-Request
Hallo erstmal
ich habe ein kleines problem mit einem Http-Request (1.1):
so dürfte ja ein Get-Request aufgebaut sein, oder?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| GET /<file> HTTP/1.1 Host: <url> Referer: http://<url>/<file> User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Connection: close Proxy-Connection: keep-alive Pragma: no-cache Cache-Control: no-cache |
naja, und dann habe ich das mal versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Socket.SendText('GET /' + EDoc.Text + ' HTTP/1.1' + #10#13 + 'Host: ' + EHost.Text + #10#13 + 'Referer: http://' + EHost.Text + '/' + EDoc.Text + #10#13 + 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)' + #10#13 + 'Connection: close' + #10#13 + 'Proxy-Connection: keep-alive' + #10#13 + 'Pragma: no-cache' + #10#13 + 'Cache-Control: no-cache' + #10#13 + #10#13); |
jedoch kommt dann immer sowas wie 302 'Moved' (Google) oder 400 'Bad Request' (einige andere Seiten) oder 'Bad Request (Invalid Header Name)' (Microsoft)
was hab ich denn da falsch gemacht?
P.S.: Indy möchte ich eher ungerne verwenden,es geht nur um eine einfache Textdatei
GTA-Place - Sa 19.11.05 16:09
Bei Indy wäre das einfach IdHTTP.Get('www.xyz.de/mydatei.php');
Wie das bei Sockets ist weiß ich allerdings nicht. Vielleicht
ist das ja so Ähnlich.
elron - So 20.11.05 07:20
nö, ich habs nen bisschen anders gemacht:
Delphi-Quelltext
1: 2: 3: 4:
| ClientSocket1.Port := 80; ClientSocket1.Host := EHost.Text; ClientSocket1.Open; MAusgabe.Lines.Add('Verbindung aufgebaut...'); |
und dann muss das ganze gesendet werden...
nur irgendwo ist da nen fehler, denn bei 99% der seiten kommt 302 und bei 1 % 400
//edit:
genau, und nochwas: wie kann man fehlermeldungen der Klasse ESocketError unterdrücken?
ich habs mal hiermit versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| try begin ClientSocket1.Port := 80; ClientSocket1.Host := EHost.Text; ClientSocket1.Open; ... end; except on ESocketError do showmessage('Fehler!'); end; end; |
ur leider geht das nicht
elron - Di 22.11.05 15:41
niemand eine idee???
zumindest bei der unteren frage müsste das doch irgendwie machbar sein...
(unterdrückung von Exceptions "ESocketError")
marconist - Do 01.12.05 21:03
Socket errors abfangen:
du definierst eine onerror procdure. Dort reagierst du auf dien Fehler und setzt die Variable errorcode schliesslich auf 0.
http request:
dein referer ist gleich dem angeforderten file, das könnte so manchen Server stören.
für eine weitere Fehlersuche müsstest du schon die jeweiligen requests zeichen für zeichen genau wiedergeben und die jeweilige Serverantwort vollständig dazu. Erst dann kann man das analysieren und testen.
error 302
das kann alle möglichen Ursachen haben. Wenn ich google.com anfordere, werde ich mit 302 auf google.at umgeleitet. Wenn ich google.at anfordere, kommt 200 OK.
srs
marconist
elron - Do 01.12.05 23:28
ja, nur wie mach ich denn die prozedur?
oder besser gesagt: wie wird die aufgerufen?
marconist - So 04.12.05 18:32
ja so wie du sonst immer eine Ereignisprozedur machst.
Ich fürchte, so ganz verstehe ich die Frage nicht, aber gut, ich versuchs.
Ich nehme mal stark an, dass wir von einem tclientsocket sprechen:
Erstellen
Du markierst den clientsocket auf dem Formularentwurf. Im Objekinspektor markierst du die Karte Ersignisse. Dort doppelclixt du rechts neben onerror un schon macht dir delphi den Quelltext auf, wo es schon das Gerüst der ClientSocket1Error procedure hineingemalt hat. Dort codest du die Fehlerbehandlung und das Zurücksetzen des errorcode auf 0 hinein. Bei Fragen, ruhig mal F1 drücken, die Delphihilfe ist recht gut, wenn man erst mal die Begriffe weiss. in der Hilfe stehen auch massenhaft Minibeispiele.
Aufruf
Ein socket fehler passiert, und das ruft dann die procedure schon auf.
Vielleicht ist es hilfreich vorerst ein paar ganz kleine Einsteigeprojekte zu schreiben, um mit den Grundlagen vertraut zu werden.
srs
marconist
elron - Mo 05.12.05 21:54
Edit: Hab es übersehen...
Aber wie genau mache ich so eine Prozedur, denn
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin showmessage('test'); end; |
liefert mir nichts zurück...
elron - Di 06.12.05 18:21
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); Memo1.Lines.Add('GET /' + EDoc.Text + ' HTTP/1.1'); Memo1.Lines.Add('Host: ' + EHost.Text); Memo1.Lines.Add('Referer: http://' + EHost.Text + '/' + EDoc.Text); Memo1.Lines.Add('User-Agent: Mozilla/4.0'); Memo1.Lines.Add('Connection: close'); Memo1.Lines.Add('Proxy-Connection: keep-alive'); Memo1.Lines.Add('Pragma: no-cache'); Memo1.Lines.Add('Cache-Control: no-cache'); Memo1.Lines.Add(''); ClientSocket1.Port := 80; ClientSocket1.Host := EHost.Text; ClientSocket1.Open;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin Socket.SendText(Memo1.Text); Memo1.Lines.Clear; end; |
so hab ich das jetzt mit dem ersten fehler gelöst...
caedes - Do 08.12.05 18:45
Mir fällt spontan auf, dass die Steuerungszeichen in falscher Reihenfolge stehen in diesem Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Socket.SendText('GET /' + EDoc.Text + ' HTTP/1.1' + #10#13 + 'Host: ' + EHost.Text + #10#13 + 'Referer: http://' + EHost.Text + '/' + EDoc.Text + #10#13 + 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)' + #10#13 + 'Connection: close' + #10#13 + 'Proxy-Connection: keep-alive' + #10#13 + 'Pragma: no-cache' + #10#13 + 'Cache-Control: no-cache' + #10#13 + #10#13); |
Dadurch, dass du es jetzt erst in ein Memo einfügst, werden die Absätze vom Programm generiert, die nämlich so aussehen sollten:
#13#10
Außerdem reicht meist schon
GET und
Host:. Den Rest kann man weglassen, wenn es für den Server nicht relevant ist, welchen Browser man benutzt usw.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!