Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datei mit PUT an HTTP-Server senden plus *Authentifizierung* (https://www.delphipraxis.net/115576-datei-mit-put-http-server-senden-plus-%2Aauthentifizierung%2A.html)

mashutu 14. Jun 2008 09:41


Datei mit PUT an HTTP-Server senden plus *Authentifizierung*
 
Servus ich moechte eine Datei an einen HTTP-Server mit Put senden.
Komponenten dazu gibt es ja (Indy,Socket), allerdings muss ich mich mit Username und Passwort authentifizieren und habe bei den Komponenten nirgends die Moeglichkeit gesehen, wo ich diese beiden Parameter mit angeben kann - so dass es funktioniert:

Versucht habe ich TidHTTP mit ProxyParams und Authentication, beides fuehrt jedoch zu Fehler 401 "Unauthorized"... (bzw. ResponseText: 'couldn't authenticate you')
Delphi-Quellcode:
httpLink.OnAuthorization:=auth;

procedure TfrmHttpConn.Auth (Sender: TObject; Authentication: TIdAuthentication; var Handled: Boolean);
begin
    Authentication.Username:=eUsername.Text;
    Authentication.Password:=ePassword.Text;
    Handled:=true;
end;
Des weiteren benoetige ich neben Get und Put auch noch DELETE, was die TidHTTP-Componente nicht als Methode anbietet (Stichwort CRUD)

Habe zwar schon viel Programmiererfahrung, aber eben noch nicht mit den Internetkomponenten...
daher ist die grosse Auswahl an vorhandenen Komponenten fuer mich (noch) etwas verwirrend.

Wichtig ist fuer mich, dass ich die Antwort auf meinen PUT-Befehl (die kommt im XML-Format) erhalte.

Danke fuer Eure Hilfe

[Edit Formulierung der Frage klarer gemacht und Code beigefuegt]

mashutu 14. Jun 2008 12:32

*Authentifizierung* geloest - aber CRUD (DELETE) gesucht
 
Da mein Username fuer den betreffenden Dienst ein Sonderzeichen beinhaltet, musste ich dieses via
%nn codiert versenden wobei nn fuer die hexadezimale Schreibweise des Sonderzeichens steht.

:-)

Nach wie vor kann ich jedoch nur GET und PUT mit TidHTTP durchfuehren.
Welche Komponente bietet mir die Meoglichkeit nach dem CRUD-Schema auch ein DELETE zu versenden?
http://de.wikipedia.org/wiki/CRUD

Danke fuer eure Hilfe

Torpedo 14. Jun 2008 13:02

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
Wieso implementierst du es nicht einfach selbst mit der Client-Komponente?
Müsste doch recht einfach sein.

mashutu 14. Jun 2008 13:04

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
Zitat:

Zitat von Torpedo
Wieso implementierst du es nicht einfach selbst mit der Client-Komponente?
Müsste doch recht einfach sein.

wie ich oben schon schrieb, habe ich noch nichts mit Net-Entwicklung am Hut gehabt.
Somit weiss ich auch nicht, was Du damit genau meinst.

Kannst Du das bitte erlaeutern - Danke?

Torpedo 14. Jun 2008 13:07

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
Ich weiß jetzt nicht genau wie PUT und DELETE funktionieren, aber der Rest von HTTP ist ziemlich einfach.

Du verbindest dich mit der Socket-Komponente also einfach zum Webserver an Port 80. Wenn du verbunden bist sendest du z.B.
DELETE /datei.html HTTP/1.1 (oder wie auch immer der Befehl lautet)

Dann schickt dir der Server eine Antwort zurück, die du in einem Event der Komponente empfängst und auswerten kannst.

mashutu 14. Jun 2008 14:12

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
@Torpedo: Ich glaube ich habe verstanden, was Du meinst.
Kann das jetzt allerdings gerade nicht (mehr) testen, da mich der Server nicht mehr reinlaesst.
Habe wohl durch meine Testerei die anzahl ungueltiger Logins von dieser IP ueberschritten.

Melde mich noch mal - Danke fuers Erste

SirThornberry 14. Jun 2008 14:25

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
wie kommst du jetzt auf DELETE? wenn ich den Ausgangspost lesen hast du einfach nur was falsch gemacht:
Zitat:

Versucht habe ich TidHTTP mit ProxyParams und Authentication, beides fuehrt jedoch zu Fehler 401 "Unauthorized"... (bzw. ResponseText: 'couldn't authenticate you')
Die ProxyParams beziehen sich ausschließlich auf den Proxyserver. Für die BasicAuthentication etc. musst du Benutzername und Passwort bei "Request" eintragen. IdHttp.Request.BasicAuthentication auf True setzen und IdHttp.Request.Username sowie IdHttp.Request.Password setzen.
Wenn die Authentifizierung über die Post-Parameter geschieht musst du diese als Feld mitsenden.

mashutu 14. Jun 2008 15:27

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
Zitat:

Zitat von SirThornberry
wie kommst du jetzt auf DELETE?

Weil ich auch einen Delete-command absenden koennen muss.

Zitat:

Zitat von SirThornberry
wenn ich den Ausgangspost lesen hast du einfach nur was falsch gemacht:
Zitat:

Versucht habe ich TidHTTP mit ProxyParams und Authentication, beides fuehrt jedoch zu Fehler 401 "Unauthorized"... (bzw. ResponseText: 'couldn't authenticate you')
Die ProxyParams beziehen sich ausschließlich auf den Proxyserver.

Ja, ich habe es auch ueber einen Proxy versucht, nachdem es ueber den direkten Weg nicht gefunzt hat.

Zitat:

Zitat von SirThornberry
Für die BasicAuthentication etc. musst du Benutzername und Passwort bei "Request" eintragen. IdHttp.Request.BasicAuthentication auf True setzen und IdHttp.Request.Username sowie IdHttp.Request.Password setzen.
Wenn die Authentifizierung über die Post-Parameter geschieht musst du diese als Feld mitsenden.

Das habe ich bereits so gemacht, aber ich bekomme trotzdem nur manchmal den connect. Meist erhalte ich die Meldung: "couldn't authenticate you"

Und das Loeschen konnte ich noch nicht so testen, wie es torpedo schrieb, weil mich aus unerfindelichen Grurnden der Server dauernd abweist...
Delphi-Quellcode:
        httpLink.Request.BasicAuthentication:=true;
        httpLink.Request.Password:=ePassword.Text;
        httpLink.Request.Username:=cleanupHTMLAuth(eUsername.Text);//cleanup special chars
       
        Moutput.Lines.Clear; //Memo with result of op
        case rgMethod.ItemIndex of //what did user choose
            0:begin
                    httpLink.request.Method:=Id_HTTPMethodPut;
                    Moutput.Lines.Text:=httpLink.Put(eURL.text,x);
            end;
            1:begin
                httpLink.request.Method:=Id_HTTPMethodGet;
                Moutput.Lines.Text:=httpLink.Get(eURL.text);
            end;
            2:begin
                s:=eURL.text;
                httpLink.Request.Method:=Id_HTTPMethodDelete;
               
                s:=httpLink.Put(s,xDummy);
                moutput.Lines.Add(s);

            end;
Aber ich lasse mich gerne belehren, falls hier noch etwas grob falsch sein sollte...

SirThornberry 14. Jun 2008 22:24

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
Wenn ich das so sehe kommt der Verdacht auf das du eventuell nicht ganz weißt wozu welche Methoden da sind.
Es ist sehr unwahrscheinlich das du bei einer Seite alle 3 Methoden benötigst.

Um dir konkret helfen zu können brauchen wir mehr Informationen.
Um welche Seite handelt es sich? kann man mit einem normalen Browser auf die Seite zugreifen und sich da einloggen? Und wenn ja: Wie sieht der Login aus? Trägt man die Daten auf der Webseite ein oder kommt vom Browser ein Fenster wo der geschützte Bereich beschrieben wird und nur ein Benutername + Passwort verlangt wird?
Bei den meisten Webseiten wo man sich auch per Browseroberfläche einloggen kann trägt man die Logindaten auf der Webseite ein. Diese werden dann über das definierte Formularfeld übergeben. Wenn dies bei dir der Fall ist muss man sich den Quelltext der Seite anschauen um zu sehen welche Formularfelder es gibt und wie die Felder für Benutzername und Passwort heißen.
Es wäre auch interessant zu wissen welche Delphiversion und Indyversion du nutzt.

mashutu 15. Jun 2008 10:31

Re: Datei mit PUT an HTTP-Server senden plus *Authentifizier
 
Zitat:

Zitat von SirThornberry
Wenn ich das so sehe kommt der Verdacht auf das du eventuell nicht ganz weißt wozu welche Methoden da sind.

Sollte ich mich tatsaechlich als Depp geoutet haben? :-)
(Eigentlich weiss ich, was ich tue...

Zitat:

Zitat von SirThornberry
Es ist sehr unwahrscheinlich das du bei einer Seite alle 3 Methoden benötigst.

Warum?
Zitat:

Zitat von SirThornberry
Um dir konkret helfen zu können brauchen wir mehr Informationen.
Um welche Seite handelt es sich?

OpenStreetMap.org
Zitat:

Zitat von SirThornberry
kann man mit einem normalen Browser auf die Seite zugreifen und sich da einloggen?

Ja-
Zitat:

Zitat von SirThornberry
Und wenn ja: Wie sieht der Login aus? Trägt man die Daten auf der Webseite ein oder kommt vom Browser ein Fenster wo der geschützte Bereich beschrieben wird und nur ein Benutername + Passwort verlangt wird?

Es gibt einen offenen Bereich und einen gescheutzten Bereich. In den geschutzten Bereich - das Editieren der Karte - kommt man ueber ein Login-Fenster.

Zitat:

Zitat von SirThornberry
Bei den meisten Webseiten wo man sich auch per Browseroberfläche einloggen kann trägt man die Logindaten auf der Webseite ein. Diese werden dann über das definierte Formularfeld übergeben. Wenn dies bei dir der Fall ist muss man sich den Quelltext der Seite anschauen um zu sehen welche Formularfelder es gibt und wie die Felder für Benutzername und Passwort heißen.

Darum geht es ja gar nicht (mehr). Sondern um das DELETE, das nicht funzt.
Zitat:

Zitat von SirThornberry
Es wäre auch interessant zu wissen welche Delphiversion und Indyversion du nutzt.

Delphi 2006 - Indy 10.1

Die Beschreibung, was ich machen soll findet sich hier:
OSM Protocol

Ausschnitt
----------------------cut--------------------
Code:
 Basic Methods for Object Access and Manipulation

For each of the above-mentioned object types, the API supports these CRUD operations (replace <objtype> by one of node, way, relation; replace <id> by the id of the object in question):

.....................................................Payload                        
Purpose_________HTTP   Method and URL_______________Request_______Response
Creation________PUT    /api/0.5/<objtype>/create____XML per DTD___id
Retrieval_______GET    /api/0.5/<objtype>/<id>______n/a___________XML per DTD
Update__________PUT    /api/0.5/<objtype>/<id>______XML per DTD___empty
Deletion________DELETE /api/0.5/<objtype>/<id>______n/a___________n/a
----------------------cut---------------------
Danke fuer Eure Muehe

Edit: Tabelle lesbarer gestaltet


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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