HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Kiffi »

Hallo,

wie kann ich POST-Daten an HTTPRequestMemory() übergeben?

Beispielsweise:

username="Peter"
password="12345"

Code: Alles auswählen

HttpRequest = HTTPRequestMemory(#PB_HTTP_Post, "http://meineSeite", ?...
Danke im Voraus & Grüße ... Peter
Hygge
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von man-in-black »

Hi,

ohne es zu testen:
String.s = "nutzername=peter&passwort=223"
den dann in den Speicher und die Adresse an die Funktion geben.

MFG
MIB

edit: oder gleich vom String den Pointer nehmen
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Kiffi »

Hi man-in-black,

nee, klappt leider noch nicht. Der Server sendet dann einen StatusCode 403.

Um konkreter zu werden: Ich versuche, das Event-Log meiner FritzBox auszulesen.

Hierzu muss ich http://fritz.box/data.lua mit den erforderlichen POST-Parametern aufrufen. Diese habe ich aus der Chrome-Developer-Console ermittelt.

Mit ARC (Advanced REST client) habe ich dann erfolgreich das Event-Log auslesen können.

Bild

Ich achte natürlich darauf, dass die SID aktuell ist.

Code: Alles auswählen

InitNetwork()

Define PostParams.s = "xhr=1&sid=[GueltigeSID]&lang=de&page=log&xhrId=all&no_sidrenew="

NewMap Header$()
Header$("Content-Type") = "application/x-www-form-urlencoded"
Header$("Content-Length") = Str(StringByteLength(PostParams))

HttpRequest = HTTPRequestMemory(#PB_HTTP_Post, "http://fritz.box/data.lua", @PostParams, StringByteLength(PostParams), 0, Header$())

If HttpRequest
  
  Debug "StatusCode: " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
  Debug "Response: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
  
  FinishHTTP(HTTPRequest)
  
Else
  
  Debug "Request creation failed"
  
EndIf
Hygge
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Bisonte »

Hast du eventuell mal probiert einen UTF8 String zu senden ? PB ist doch ünicöde... evt. reicht da ein *PostParam = UTF8("...") ?
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Kiffi »

@Bisonte: Du bist ein Schatz! Ett klappt! :allright:

Code: Alles auswählen

EnableExplicit

InitNetwork()

Define *PostParams
Define HTTPRequest

*PostParams = UTF8("xhr=1&sid=[GueltigeSID]&lang=de&page=log&xhrId=all&no_sidrenew=")

HttpRequest = HTTPRequestMemory(#PB_HTTP_Post, "http://fritz.box/data.lua", *PostParams, MemorySize(*PostParams))

If HttpRequest
  
  Debug "StatusCode: " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
  Debug "Response: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
  
  FinishHTTP(HTTPRequest)
  
Else
  
  Debug "Request creation failed"
  
EndIf
Danke & Grüße ... Peter
Hygge
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Sicro »

@Kiffi:
Wieso nimmst du nicht einfach den Befehl "HTTPRequest()"?
Bei dem kannst du die POST-Parameter als String übergeben.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Kiffi »

Sicro hat geschrieben:Wieso nimmst du nicht einfach den Befehl "HTTPRequest()"?
:freak: ja, das frage ich mich jetzt (nach Studium der Hilfe) allerdings auch... :lol:

Danke für den Tipp! :allright:

Nachträglich auch noch mal Danke an man-in-black!

Grüße ... Peter (lernt nie aus)
Hygge
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von mk-soft »

Hi Kifft,

wenn du so weit bist, kannst du mal schreiben wie man die Anruferlisten abfragen kann.
Man muss sich ja anmelden um diese Daten abzufragen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Kiffi »

mk-soft hat geschrieben:wenn du so weit bist, kannst du mal schreiben wie man die Anruferlisten abfragen kann.

Code: Alles auswählen

InitNetwork()
HttpRequest = HTTPRequest(#PB_HTTP_Post, "http://fritz.box/data.lua", "xhr=1&sid=[DeineSID]&lang=de&page=dialLi&no_sidrenew=")
If HttpRequest
  Debug "StatusCode: " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
  Debug "Response: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
  FinishHTTP(HTTPRequest)
Else
  Debug "Request creation failed"
EndIf
mk-soft hat geschrieben:Man muss sich ja anmelden um diese Daten abzufragen.
Für das Anmelden und Ermitteln der SID habe ich im Forum folgenden Code gefunden (finde die Quelle momentan leider nicht mehr):

Code: Alles auswählen

EnableExplicit

InitNetwork()

Global uiPass.s, gSeite.s, user.s

UseMD5Fingerprint()

uiPass = "DeinPass"
user.s = "DeinUser"

Procedure SeiteLaden(Seite.s)
  
  Protected *Buffer
  Protected Size
  
  gSeite = ""
  *Buffer = ReceiveHTTPMemory("http://fritz.box" + Seite)
  If *Buffer
    Size = MemorySize(*Buffer)
    gSeite = PeekS(*Buffer, Size, #PB_UTF8|#PB_ByteLength)
    FreeMemory(*Buffer)
  Else
    MessageRequester("Fehler", "Fehler beim Laden der Seite" + #CRLF$ + Seite)
  EndIf
  
EndProcedure

Procedure.s FindeDaten(Suche.s, Stelle = 1, eSuche.s = "")
  Protected aSuche.s
  Protected PzWertA.s
  
  aSuche.s = "<" + Suche + ">"
  If eSuche = "" : eSuche.s = "</" + Suche + ">" : EndIf
  PzWertA.s = StringField(gSeite, Stelle + 1, aSuche)
  ProcedureReturn StringField(PzWertA, 1, eSuche)
EndProcedure

Procedure.s fbSID()
  Protected *Buffer
  Protected PzWertC.s
  Protected PzWertA.s
  Protected PzWertB.s
  Protected a
  SeiteLaden("/login_sid.lua")
  *Buffer = AllocateMemory(200)
  PzWertC.s = FindeDaten("Challenge")
  PzWertA.s = PzWertC + "-" + uiPass
  For a = 1 To Len(PzWertA)
    PokeC(*Buffer + a + a - 2, Asc(Mid(PzWertA,a,1)))
    PokeC(*Buffer + a + a - 1, 0)
  Next
  PzWertB.s = Fingerprint(*Buffer, Len(PzWertA) + Len(PzWertA),#PB_Cipher_MD5)
  FreeMemory(*Buffer)
  SeiteLaden("/login_sid.lua?response=" + PzWertC + "-" + PzWertB + "&username=" + user)
  ProcedureReturn FindeDaten("SID")
EndProcedure

Define SID.s

SID = fbSID()

Debug SID
Grüße ... Peter
Hygge
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: HTTPRequestMemory(): Wie übergebe ich die POST-Daten?

Beitrag von Bisonte »

Kiffi hat geschrieben: Für das Anmelden und Ermitteln der SID habe ich im Forum folgenden Code gefunden (finde die Quelle momentan leider nicht mehr):
Quelle nachreich ;)
viewtopic.php?f=16&t=30484 auf Seite 2.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten