HttpClient() und HttpRequest()

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

HttpClient() und HttpRequest()

Beitrag von georg »

Hallo,


aktuell versuche ich, von wget auf die Http...()-Klassen umzustellen.

Allerdings scheitere ich schon an der ersten Hürde. Es geht darum, eine automatisierte Anmeldung in einem Forum durchzuführen.

Hier mal die relevanten Code-Ausschnitte:

Code: Alles auswählen

   // Seite lesen und Cookies erfragen
   cDomain := "https://mein-ganz-tolles-forum.de"
   oHTTP := HttpClient():new(cDomain)
   oHTTPReq := HTTPRequestMessage():new(cDomain)
   oResponse := oHTTP:send(oHTTPReq)
   aCookies := oResponse:getCookies()
   cContent := oResponse:getContent()
Das funktioniert, und ich bekomme auch die Einstiegscookies sowie einige Werte, die im Login-Formular eingebettet sind und bei der Anmeldung als POST-Daten übergeben werden müssen.

Im nächsten Schritt versuche ich, mich anzumelden:

Code: Alles auswählen

   cReqPage := cDomain + "/login.php?do=login"
   oHTTP := HttpClient():new(cReqPage)
   oHTTPReq := HTTPRequestMessage():new(cReqPage)
   nLen := Len(aCookies)
   FOR nI := 1 TO nLen
      oHTTPReq:setCookie(aCookies[nI])
   NEXT
Dazu wird die URL angepasst (ich habe die Anmeldung in Firefox durchgeführt und mittels F12 und "Network" protokolliert, was genau ausgetauscht wird), die Cookies aus dem ersten Schritt im HttpRequest()-Objekt hinterlegt. Dann folgen die Anmeldeparameter, ebenfalls aus dem Network-Trace "abgekupfert":

Code: Alles auswählen

   oHTTPReq:setParameter("vb_login_username",        "username")
   oHTTPReq:setParameter("vb_login_password",        "geheimespasswort")
   oHTTPReq:setParameter("cookieuser",               1)
   oHTTPReq:setParameter("s",                        "---")  // aus cContent ausgelesen
   oHTTPReq:setParameter("securitytoken",            cSecToken)    // dito.
   oHTTPReq:setParameter("do",                       "login")
   oHTTPReq:setParameter("vb_login_md5password",     "---")    // dito
   oHTTPReq:setParameter("vb_login_md5password_utf", "---")    // dito
   oHTTPReq:setMethod("POST")
   oHTTP:setMethod("POST")
   oResponse := oHTTP:send(oHTTPReq)
Beim Ausführen der :send()-Methode hängt sich das Programm dann auf. Strg-C hilft, aber das bringt mich im automatisierten Anmeldeprozess nicht weiter.

Da ja etliche hier schon damit arbeiten, habt Ihr (hoffentlich) einen Hinweis, was ich falsch mache, oder wie ich es besser gestalten kann?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HttpClient() und HttpRequest()

Beitrag von Dominik Krebs »

Hallo Georg,
Was bedeutet denn, hängt sich auf?
Gibt es eine Fehlermeldung?

Der Code sieht gut aus, ich spreche die Response aber immer direkt an.

Code: Alles auswählen

oHTTPClient:httpRequest:setCookie(...)
Denn mir dem erzeugen des HTTPClienten hast du bereits eine neue HTTPRequest Instanz im Objekt enthalten, und musst es in der :send() Methode auch nicht übergeben.
Gruß Dominik
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: HttpClient() und HttpRequest()

Beitrag von georg »

Hallo, Dominik -


"hängt sich auf" heisst genau das. Im Debugger führe ich den Schritt :send() aus, und dann tut sich im Programm nichts mehr. Es hängt. Selbst nach einer halben Stunde tut sich nichts.

Einzige Option: abbrechen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: HttpClient() und HttpRequest()

Beitrag von Jan »

Hallo Georg,

nach meinen bisherigen Erfahrungen sagt daß, das Dein HTTPClient auf die Antwort wartet, die aber nicht kommt. Und der angesprochene Server sendet auch kein Timeout. Also wartet Dein HTTPClient bis der Strom mal irgend wann ausfällt.

Ich setze voraus das der Server korrekt arbeitet. Dann sprichst Du also wohl den Server so falsch an, so das der gar nicht merkt das Du was von ihm willst - sonst würde der Dir ja irgend eine Meldung zurück geben, und wenn es nur eine Fehlermeldung wäre.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: HttpClient() und HttpRequest()

Beitrag von georg »

Hallo, Jan -


ja, davon gehe ich auch aus. Und weil die Dokumentation solche Dinge wie POST etc. noch nicht abbildet, habe ich halt hier gefragt.

Aber ich habe jetzt schon mal ein paar Ansatzpunkte, wo ich testen kann.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: HttpClient() und HttpRequest()

Beitrag von ramses »

Hallo Georg

schau doch mal in der Doku ob du ein Timeout für :send() einstellen kannst.

Jedenfalls bei xb2.net lassen sich verschiedene Timeout einstellen die genau dazu da sind "hängende" Operationen zu beenden bevor der Strom ausgeht.....
Valar Morghulis

Gruss Carlo
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: HttpClient() und HttpRequest()

Beitrag von Dominik Krebs »

Code: Alles auswählen


:setTimeout( [<nResolveTimeout>], [<nConnectTimeout>], [<nSendTimeout>], [<nReceiveTimeout>] ) --> self
Gruß Dominik
Antworten