Post-Daten schicken + Antwort empfangen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Post-Daten schicken + Antwort empfangen

Beitrag von gnasen »

Hallo,
ich scheitere derzeit echt an einer, für mich mittlerweile zum Geduldsspiel werdenden, Aufgabe.

In der Theorie ist es so einfach, Daten per Post Befehl ans .php script, antwort empfangen und sich freuen.

In der Praxis passiert leider.... Nichts. Ich weiss nicht wo der Fehler liegt, da ich keine Möglichkeit kenne, den Fehler zu orten, bzw zu finden.

Code entstammt dem englischen PB Forum, soll auch funktionieren (hatte es selber vorher so angegangen, aber warum das Rad neu erfinden, wenn es schon umgesetzt wurde ;) )

Code: Alles auswählen

 ; 
  ; All stuff for the WinInet lib. 
  ; 
#INTERNET_OPEN_TYPE_DIRECT = 1 
#HTTP_ADDREQ_FLAG_ADD = $20000000 
#HTTP_ADDREQ_FLAG_REPLACE = $80000000 
#INTERNET_FLAG_SECURE = $800000 
  
  ; 
  ; Type of connection (could be FTP Gopher etc). HTTPS is done as HTTP too. 
  ; 
#INTERNET_SERVICE_HTTP = 3 
  
  ; 
  ; HTTP port is 80, HTTPS (SSL) port is 443. 
  ; 
#INTERNET_DEFAULT_HTTP_PORT = 443  

Procedure do_post() 
  
  ; 
  ; Do NOT include http:// or any other protocol indicator here 
  ; 
  ;host.s = "secure.example.com" 
  host.s = "tools.gw-tactics.de" 
  
  ; 
  ; Everything after the hostname of the server 
  ; 
  ;get_url.s = "/pb_test.php" 
  get_url.s = "/ddd.php" 
  
  ; 
  ; Holds the result from the CGI/page 
  ; 
  ;result.s = "" 
  result.s = "" 
  
  ; 
  ; All from the wininet DLL 
  ; 
  ; Be sure your Internet Explorer is up to date! 
  ; 
  open_handle = InternetOpen_("User Agent Info Goes Here",#INTERNET_OPEN_TYPE_DIRECT,"","",0) 
  
  connect_handle = InternetConnect_(open_handle,host,#INTERNET_DEFAULT_HTTP_PORT,"","",#INTERNET_SERVICE_HTTP,0,0) 
  
  request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,#INTERNET_FLAG_SECURE,0) 
  
  headers.s = "Content-Type: application/x-www-form-urlencoded" +Chr(13)+Chr(10) 
  
  HttpAddRequestHeaders_(request_handle,headers,Len(headers), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD) 
  
  post_data.s = "testval=5" 
  
  post_data_len = Len(post_data) 
  
  send_handle = HttpSendRequest_(request_handle,"",0,post_data,post_data_len) 
  
  Buffer.s = Space(1024) 
  
  bytes_read.l 
  
  total_read.l 
  
  total_read = 0 
  
  ; 
  ; Read until we can't read anymore.. 
  ; The string "result" will hold what ever the server pushed at us. 
  ; 
  Repeat 
    
    InternetReadFile_(request_handle,@Buffer,1024,@bytes_read) 
    
    result + Left(Buffer,bytes_read) 
    
    Buffer = Space(1024) 
    
  Until bytes_read=0 
  
  Debug result
  
EndProcedure

do_post()
Daten stehen drin, Antwort sollte "test" (o.Ä.) und der geschickte Parameter sein.

Wenns jemand ans laufen bekommt, wäre ich dafür seeehr Dankbar.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Das das Script fehlerfrei ist ist sicher?
(\/) (°,,,°) (\/)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

haben 2 leute unabhängig voneinander gesagt
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Okay, stimmt funzt, habs grad probiert, aber mit dem code kann ich dir auch nicht weiterhelfen, zu viel API-Zeugs... (Wenns nur um ein bisschen datenaustausch geht würde ich mir den HTTP-Request einfach selber schreiben...)
(\/) (°,,,°) (\/)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Na dann mal her damit ;)
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

HTML hat geschrieben:

Code: Alles auswählen

<form action='http://tools.gw-tactics.de/ddd.php' method='POST'>
  <input type='text' value='4' name='testval' /><br/>
  <input type='submit' name='submit' value='Send' />
</form>
(*g*)

EDIT:

Konnte es irgendwie doch nich lassen *g*

Code: Alles auswählen

OpenConsole()

PrintN("DL")



link.s = "/ddd.php"
cookie.s = ""



POST.s = "testval1=einepost&testval2=4"
GET.s  = "testval3=einget&testval4=9192"





If GET
  link+"?"+GET
EndIf


PrintN("Link: "+link)


InitNetwork()

connectionid = OpenNetworkConnection("tools.gw-tactics.de",80)

PrintN("Connect to Server: "+Str(connectionid))



If ConnectionID
  

text$+"POST "+link+" HTTP/1.0"
text$+#CRLF$
text$+"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*"
text$+#CRLF$
text$+"Accept-Language: de"
text$+#CRLF$
text$+"Content-Type: application/x-www-form-urlencoded"
text$+#CRLF$
;text$+"Referer: www.pure-board.de"
;text$+#CRLF$
text$+"UA-CPU: x86"
text$+#CRLF$
text$+"Accept-Encoding: gzip, deflate"
text$+#CRLF$
text$+"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
text$+#CRLF$
text$+"Host: tools.gw-tactics.de"
text$+#CRLF$

If POST
  text$+"Content-Length: "+Str(Len(POST)+1)
  text$+#CRLF$
EndIf

text$+"Connection: close"
text$+#CRLF$

If cookie
  text$+"Cookie: "+cookie
  text$+#CRLF$
EndIf

If POST
  text$+#CRLF$
  text$+POST
  text$+#CRLF$
EndIf

text$+#CRLF$
;Debug text$





#buff = 1024
*buffer = AllocateMemory(#buff)


  PokeS(*buffer,text$)

  PrintN("Anfrage... "+Str(SendNetworkData(connectionid,*buffer,#buff)))
  
  filein$ = ""
  dd = ElapsedMilliseconds()
  Repeat
    nce = NetworkClientEvent(connectionid)
    Delay(1)
    
    Select nce
      Case 0
        ;dd+1
      Case 2
        
        dd = ElapsedMilliseconds()
        PrintN("Empfange Daten...")
        Datas+1
        *buffer = AllocateMemory(#buff)
        ReceiveNetworkData(connectionid,*buffer,#buff)
        sbuffer.s = PeekS(*buffer,#buff)
        sbuffer = RTrim(sbuffer)
        
        If FindString(sbuffer,"Content-Type: text/html",1)
          PrintN("Headerdaten...")
          pos = FindString(sbuffer,"Content-Type: text/html",1)+Len("Content-Type: text/html")+10
          sbuffer = Mid(sbuffer,pos,Len(sbuffer)-pos)
        EndIf
        
        PrintN("Filesize: "+Str(Len(sbuffer)))
        
        If Right(sbuffer,5) = "0"+#CRLF$+#CRLF$
          dd = 0
          sbuffer = Left(sbuffer,Len(sbuffer)-5)
        EndIf
        
        PrintN("---")
        PrintN(sbuffer)
        PrintN("---")
        
        ;filein$+sbuffer
        
        
      Case 3
        PrintN("File-Error!")
        Input()
    EndSelect
    
    If ElapsedMilliseconds()-dd > 1000
    
    
;       PrintN("Speichere File "+Str(cc))
;       
;       
;       If CreateFile(0,"c:\dlindex.htm")
;         WriteString(0,filein$)
;         CloseFile(0)
;         RunProgram("c:\dlindex.htm")
;       Else
;         PrintN("Save Errör")
;         Input()
;       EndIf
      
      
      Input()
      CloseConsole()
      End
    EndIf
  ForEver
EndIf
Ich denke es erklärt sich alles selbst, deswegen hab ich mir auch kommentare gespaart...
Frag einfach wenn was unklar is...

sollte in etwa das rauskommen:
Code hat geschrieben:UTF-8

GETeinget
9192POSTeinepost
4
Das Script gibt allerdings eine leicht komische antwort, funzt aber...
Zuletzt geändert von KeyKon am 12.03.2008 01:23, insgesamt 5-mal geändert.
(\/) (°,,,°) (\/)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ohje... da versucht man den Fehler zu finden, wundert sich warum das Programm versucht auf Port 443 anstatt Port 80 zu verbinden und dann stieht man durch Zufall nach paar Minuten verzweifeltem Suchen am Anfang des Codes "#INTERNET_DEFAULT_HTTP_PORT = 443"...
Also wer das da hingeschrieben hat gehört ordentlich in den Arsch getreten. Falsches setzen von WinAPI Konstanten muss ja früher oder später zu unerklärlichen Bugs führen. Naja... die Lösung ist jedenfalls:
"#INTERNET_DEFAULT_HTTP_PORT = 80" anstatt
"#INTERNET_DEFAULT_HTTP_PORT = 443"
und
"request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,0,0)" anstatt
"request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,#INTERNET_FLAG_SECURE,0)"


Dein Server mag es nämlich nicht wen man ihn per https anspricht.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

lol, darauf hab ich garnicht geschaut xD
aber mit meinem code kannste das ganze immerhin Systemunabhängig machen^^
(\/) (°,,,°) (\/)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

na super, ich habe, um ehrlich zu sein, die Konstanten nicht geprüft. (Ich dachte all die Zeit, der Fehler würd im Header liegen :freak: )

Funktioniert super, genau so, wie es soll.

Deine Möglichkeit, einfach alles über SendData zu schicken funktioniert auch 1a.

Wenn man den Header aufräumt (alles optionale raus) kommt auch wirklich nur noch die Antwort. Wenn ich den Header wie bei dir lasse, kommt einiges an Schmarn mit.

Danke an beide :allright:
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

ich wollte ausprobieren mich bei wikipedia einzuloggen:
http://de.wikipedia.org/w/index.php?tit ... Hauptseite

Code: Alles auswählen

host.s = "de.wikipedia.org"
get_url.s = "/w/index.php?title=Spezial:Anmelden"
und dann dies hier senden:

Code: Alles auswählen

post_data.s = "wpName=username&wpPassword=password"
Aber ich bekomme keine Login ERROR/CORRECT-Seite sondern immer wieder nur die index.php?title=Spezial:Anmelden :(
Antworten