Seite 1 von 2

Post-Daten schicken + Antwort empfangen

Verfasst: 11.03.2008 20:25
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.

Verfasst: 11.03.2008 22:44
von KeyKon
Das das Script fehlerfrei ist ist sicher?

Verfasst: 11.03.2008 23:11
von gnasen
haben 2 leute unabhängig voneinander gesagt

Verfasst: 11.03.2008 23:49
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...)

Verfasst: 11.03.2008 23:58
von gnasen
Na dann mal her damit ;)

Verfasst: 12.03.2008 00:43
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...

Verfasst: 12.03.2008 01:09
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.

Verfasst: 12.03.2008 01:20
von KeyKon
lol, darauf hab ich garnicht geschaut xD
aber mit meinem code kannste das ganze immerhin Systemunabhängig machen^^

Verfasst: 12.03.2008 11:28
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:

Verfasst: 22.05.2008 22:35
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 :(