BtbN's Funktionssammlung Nr.1: HTTP-POST-REQUESTS,Bank
Übersicht

![]() |
BtbNBetreff: BtbN's Funktionssammlung Nr.1: HTTP-POST-REQUESTS,Bank |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Type posts
Field name$ Field inhalt$ End Type Function SetPostFieldText(name$,inhalt$) name$=Replace$(name$,"%","%25") name$=Replace$(name$,"+","%2B") name$=Replace$(name$," ","%20") name$=Replace$(name$,"@","%40") name$=Replace$(name$,"ß","%DF") name$=Replace$(name$,"?","%3F") name$=Replace$(name$,"=","%3D") name$=Replace$(name$,")","%29") name$=Replace$(name$,"(","%28") name$=Replace$(name$,"/","%2F") name$=Replace$(name$,"&","%26") name$=Replace$(name$,"$","%24") name$=Replace$(name$,"§","%A7") name$=Replace$(name$,Chr$(34),"%22") name$=Replace$(name$,"!","%21") name$=Replace$(name$,"^","%5E") name$=Replace$(name$,"#","%23") name$=Replace$(name$,"<","%3C") name$=Replace$(name$,">","%3E") name$=Replace$(name$,"{","%7B") name$=Replace$(name$,"}","%7D") name$=Replace$(name$,"[","%5B") name$=Replace$(name$,"]","%5D") inhalt$=Replace$(inhalt$,"%","%25") inhalt$=Replace$(inhalt$,"+","%2B") inhalt$=Replace$(inhalt$," ","%20") inhalt$=Replace$(inhalt$,"@","%40") inhalt$=Replace$(inhalt$,"ß","%DF") inhalt$=Replace$(inhalt$,"?","%3F") inhalt$=Replace$(inhalt$,"=","%3D") inhalt$=Replace$(inhalt$,")","%29") inhalt$=Replace$(inhalt$,"(","%28") inhalt$=Replace$(inhalt$,"/","%2F") inhalt$=Replace$(inhalt$,"&","%26") inhalt$=Replace$(inhalt$,"$","%24") inhalt$=Replace$(inhalt$,"§","%A7") inhalt$=Replace$(inhalt$,Chr$(34),"%22") inhalt$=Replace$(inhalt$,"!","%21") inhalt$=Replace$(inhalt$,"^","%5E") inhalt$=Replace$(inhalt$,"#","%23") inhalt$=Replace$(inhalt$,"<","%3C") inhalt$=Replace$(inhalt$,">","%3E") inhalt$=Replace$(inhalt$,"{","%7B") inhalt$=Replace$(inhalt$,"}","%7D") inhalt$=Replace$(inhalt$,"[","%5B") inhalt$=Replace$(inhalt$,"]","%5D") For p.posts = Each posts If p\name$ = name$ Then p\inhalt$ = inhalt$ Return 2 EndIf Next p.posts = New posts p\name$ = name$ p\inhalt$ = inhalt$ Return 1 End Function Function DeletePostField(name$) name$=Replace$(name$,"%","%25") name$=Replace$(name$,"+","%2B") name$=Replace$(name$," ","%20") name$=Replace$(name$,"@","%40") name$=Replace$(name$,"ß","%DF") name$=Replace$(name$,"?","%3F") name$=Replace$(name$,"=","%3D") name$=Replace$(name$,")","%29") name$=Replace$(name$,"(","%28") name$=Replace$(name$,"/","%2F") name$=Replace$(name$,"&","%26") name$=Replace$(name$,"$","%24") name$=Replace$(name$,"§","%A7") name$=Replace$(name$,Chr$(34),"%22") name$=Replace$(name$,"!","%21") name$=Replace$(name$,"^","%5E") name$=Replace$(name$,"#","%23") name$=Replace$(name$,"<","%3C") name$=Replace$(name$,">","%3E") name$=Replace$(name$,"{","%7B") name$=Replace$(name$,"}","%7D") name$=Replace$(name$,"[","%5B") name$=Replace$(name$,"]","%5D") For p.posts = Each posts If p\name$ = name$ Delete p.posts Return True EndIf Next Return False End Function Function FreePostFields() Delete Each posts End Function Function CallPostURL(url$,port=80,headerbank=0) Local msg1$ Local server$ = Replace(url$,"http://","") server$ = Mid(server$,1,Instr(server$,"/")-1) url$ = Replace(url$,"http://","") If Instr(url$,"/") Then url$ = Mid(url$,Instr(url$,"/")) Else url$ = "/" EndIf Local SENDHEADER$ = "POST "+url$+" HTTP/1.1" + Chr$(13)+Chr$(10) SENDHEADER$ = SENDHEADER$ + "Host: "+ server$ + Chr$(13)+Chr$(10) SENDHEADER$ = SENDHEADER$ + "User-Agent: BlitzBasic"+ Chr$(13)+Chr$(10) SENDHEADER$ = SENDHEADER$ + "Connection: close" + Chr$(13)+Chr$(10) SENDHEADER$ = SENDHEADER$ + "Content-Type: application/x-www-form-urlencoded" + Chr$(13)+Chr$(10) Local POSTDATA$ For p.posts = Each posts If POSTDATA$ <> "" Then POSTDATA$ = POSTDATA$ + "&"+p\name$+"="+p\inhalt$ Else POSTDATA$ = p\name$+"="+p\inhalt$ EndIf Next SENDHEADER$ = SENDHEADER$ + "Content-length: "+Len(POSTDATA$)+Chr$(13)+Chr$(10)+Chr$(13)+Chr$(10) FreePostFields() SENDHEADER$ = SENDHEADER$ + POSTDATA$ Local TCPStream = OpenTCPStream(server$,port) If TCPStream = 0 Then Return False WriteLine(TCPStream,SENDHEADER$) Local headerinfo$ Repeat msg1$ = ReadLine(TCPStream) If msg1$ = "" Then Exit If Eof(TCPStream) Then Exit headerinfo$ = headerinfo$ + msg1$ + Chr(13) + Chr(10) Forever If headerbank <> 0 Then ResizeBank(headerbank,Len(headerinfo$)+20) PokeString(headerbank,0,headerinfo$) EndIf Return TCPStream End Function Function PeekString$(bank,offset=0) Local outstring$ Repeat If PeekByte(bank,offset) = 7 Then Exit outstring$ = outstring$+Chr(PeekByte(bank,offset)) offset = offset + 1 Forever Return Left(outstring$,Len(outstring$)-2) End Function Function PokeString(bank,offset,value$) Local o For o = 1 To Len(value$) PokeByte(bank,offset+o-1,Asc(Mid(value$,o,1))) Next PokeByte(bank,o+1,7) End Function Anwendungsbeispiel: BlitzBasic: [AUSKLAPPEN] bank = CreateBank(1) Also: Funktion: SetPostFieldText Fügt ein neues POST-Feld hinzu, welches zum senden gespeichert wird Parameter: name$ : Der Name des Feldes inhalt$ : Der Inhalt des Feldes Funktion: DeletePostField Löscht ein POST-Feld, anhand des Namens Parameter: name$ : Der Name des Feldes, was gelöscht werden soll Rückgabe: True wenn gelöscht, ansonsten False Funktion: FreePostFields Löscht alle bereits eingetragenen POST-Felder Funktion: CallPostURL Ruft eine URL auf, dabei muss man die URL nicht zerteilen oder sonstiges, GET-Variablen können wie im Browser an die URL angehangen werden, die POST-Variablen über die POST-Variablen Befehle. Dies kann natürlich auch zum simplen aufrufen einer URL verwendet werden. Die HTTP-Header werden auch weggeschnitten, man ließt direkt am beginn des Dokuments. Parameter: url$: Die komplette URL, inklusive GET-Werten [port] : Der Server Port, Kann ausgelsaaen werden, dann 80 [headerbank] : Hier kann ein Handle einer Bank angegeben werden, in die die HTTP-Heder gespeichert werden, die größe der Bank ist egal, sie wird automatisch angepasst. Mit dem Befehl PeekString kann der Header dann aus der Bank ausgelesen werden. Dieser Parameter is ebenfals optional. Funktion: PeekString Ein erweiterter Bank-Befehl, mit ihm kann man einen String aus einer Bank lesen. ACHTUNG: Wenn vorher kein String mit PokeString geschreiben wurde, führ dies zu einem Error! Parameter: bank: Das Bank-Handle [offset]: Start-Position des Strings. Standart ist 0 Rückgabe: Der String Funktion PokeString Ein erweiterter Bank-Befehl, schreibt einen String in eine Bank, wenn die Bank zu klein ist, führt dies zu einem Error. Der String kann mit PeekString wieder ausgelesen werden. Parameter: bank: Das bank-Handle offset: Start-Position des Strings value$: Der String, der geschreiben werden soll Mfg, BORNtobeNAMELESS |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Super-nützlich! ![]() Zwei Punkte dazu: 1. Mir ist irgendwie noch nicht so ganz klar, wozu du die Bank brauchst? So wie ich das verstehe, stopfst du da den zurückkommenden Standard-Header vom Server rein -aber wozu? 2. Übersichtlicher wäre es vielleicht, wenn du eine eigene Funktion zum URL-Encoden benutzt, dann muß man das nicht dreimal schreiben: BlitzBasic: [AUSKLAPPEN]
|
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Diese bank is dazu gedacht, das man, wenn man will, die Header des server bekommen kann.
Einfach da nen bank-Handle rein, und er haut die Header in die Bank. |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, das ist mir schon klar -aber welche Vorteile hat es, dafür eine Bank zu benutzen? Ist das persönliche Vorliebe oder habe ich da einen Vorteil übersehen? | ||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nenn mir ne alternative!
Ich geba ja schon den TCP-Stream zurück... |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich ignoriere den zurückgesendeten Header eigentlich komplett. Wenn es einen Datenbankfehler o.ä. gab, sendet mein Script auf dem Server eine Zeile zurück, die am Anfang "ERROR: ..." enthält. Das ganze blah-blah vom Server schenke ich mir in dem Fall, es genügt ja, zu wissen, wo die eigentlichen Ausgabewerte des Script anfangen.
Meine Frage war eher so gemeint, welche Gründe es geben könnte, den Header zu speichern und wozu man diese Daten noch verwenden kann. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Justus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie ich BtbN kenne, ist es reine Neugier ![]() Es hat eigentlich keinen praktischen Nutzen... |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein gutes Beispiel, wenn man nen eigenen Renderer/Browser schreiben will ist ja, dass die Cookies in ner Header-Zeile gesendet werden.
Wenn man nun also diese Cookie verarbeiten möchte, muss man ja die Heder haben. Oder wenn man wissen will, ob die Seite ein Passwort braucht, kommt das auch über die Header... |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Seltsam -mein Programm empfängt keine Daten mehr vom Script, seitdem ich es jetzt von GET (HTTP 1.0) mittels obiger Methode auf POST (HTTP 1.1) geändert habe. Der Header (in dem Fall doch sinnvoll! ![]() Woran könnte das denn liegen? |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
da drinne steht nix? ^^
Achja: Bei HTTP 1.0 konnte man GET http://test.de/123.html machn, bei HTTP 1.1 muss man GET /123.html |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, das habe ich berücksichtigt. So sieht das nun aus:
BlitzBasic: [AUSKLAPPEN]
Die Verbindung wird ja hergestellt -der Server antwortet ja mit OK und gibt auch kein "not found" oder so zurück. Aber ausser Header und der Leerzeile kommen einfach keine Daten mehr vom Script zurück. ![]() |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
kanns sein, der er schlicht nichts sendet?
Versuch ma, das über meine Lib zu machen. |
||
- Zuletzt bearbeitet von BtbN am Sa, Dez 10, 2005 18:23, insgesamt einmal bearbeitet
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieso aufspalten, denke schon, daß das direkt damit zu tun hat und sicher für alle hilfreich ist, die ebenfalls damit arbeiten möchten.
Das Testscript besteht aus einem simplen echo"BLAH" und gibt auf jeden Fall etwas aus. Es muß irgendwie an der POST-Methode oder dem Header wie oben angegeben liegen, denke ich. Hast du den Code mal auf einem lokalen Windows-Server getestet? Könnte es sein, daß sich das unter Windows irgendwie anders verhält? In meinem vorigen Code hatte ich z.B. auch keine LineFeeds bentutzt. Da sah der Header so aus (und es hat funktioniert): BlitzBasic: [AUSKLAPPEN]
Es muß wohl irgendwie am Header liegen, wenn ich nicht irgendwo einen Fehler reingehauen habe... |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Grundsätzlich:
HTTP bleibt HTTP, egal ob Windows oder Linux. Ich seh da überhaupt keinen Fehler, ka, worans liegt. |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast recht, hast recht! War mein Fehler -ich habe jetzt stundenlang im Code rumgegraben -es lag mal wieder an irgendeinem miesen, kleinen, erbärmlichen Flüchtigkeitsfehler ![]() Funktioniert -danke euch ![]() |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group