Seite 1 von 2
Http URLDownloadToFile Windows
Verfasst: 16.04.2012 14:46
von kunstlust
Ich möchte von einem Drucker eine XML Datei herunterladen und verstehe nicht warum ich mit ReceiveHTTPFile ein anderes Ergebnis bekomme, als mit der API von Windows per URLDownloadToFile_. Ich habe es auch per Socket versucht, dort ist die Datei genauso klein wie ReceiveHTTPFile. Es handelt sich um eine XML Datei, die nur bei URLDownloadToFile_ richtig heruntergeladen wird. Da alles im Lokale Netz ist und ich die Datei per Browser auch herunterladen kann, versteh ich nicht vorher der Fehler kommt, da ich gerne später auch unter Linux/Mac arbeiten möchte, macht die API aber keinen Sinn. Ich bekomme bei ersten Download auch einen Fehler, aber leider eben nicht woher… Könnt Ihr mir einen Tip geben? Danke
Code: Alles auswählen
InitNetwork()
If download1 = ReceiveHTTPFile("http://192.168.110.146/hp/device/webAccess/open_accounting.xml", "t:\open_accounting.xml")
Debug "OK "+Str(download1)
Else
Debug "Fehler " +Str(download1)
EndIf
If download2 = URLDownloadToFile_(0,"http://192.168.110.146/hp/device/webAccess/open_accounting.xml", "t:\open_accounting_1.xml",0,0)
Debug "OK "+Str(download2)
Else
Debug "Fehler " +Str(download2)
EndIf
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:00
von RSBasic
Sicher, dass bei dir wirklich keine Datei erstellt wird oder schaust du nur auf deine Debug-Ausgabe?
Also ich habs mal bei mir getestet:
Code: Alles auswählen
InitNetwork()
If ReceiveHTTPFile("http://www.rsbasic.de/grafiken/rsbasic_logo.png", "C:\Projekte\open_accounting.png")
Debug "OK "+Str(download1)
Else
Debug "Fehler " +Str(download1)
EndIf
Funktioniert einwandfrei.
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:04
von STARGÅTE
Dein Code ist falsch!
setzt
nicht Wert auf den Rückgabewert der Funktion und prüft dann ob es ungleich 0 ist.
In PB gibt es "sowas" nicht.
In deinem Code wird einfach nur download1 und download2 mit den Funktionsrückgabewerten verglichen.
URLDownloadToFile_() gibt 0 zurück bei erfolg, also 0=0, deswegen wird dort WAHR ausgeführt.
ReceiveHTTPFile() gibt bei Erfolg etwas ungleich 0 zurück, also 0=348765, deswegen ist das immer FLASCH.
Also immer:
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:09
von NicTheQuick
Ist das XML valide? Ich kenne zumindest das Problem, dass XML-Dateien, die nicht ihrer Spezifikation entsprechen, gerne nicht geladen werden.
Hast du mal andere XML-Dateien getestet?
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:30
von kunstlust
OK das mit der Funktion war mein Fehler:
Code: Alles auswählen
InitNetwork()
If ReceiveHTTPFile("http://192.168.110.146/hp/device/webAccess/open_accounting.xml", "t:\open_accounting.xml")
Debug "OK 1"
Else
Debug "Fehler 1"
EndIf
If download2 = URLDownloadToFile_(0,"http://192.168.110.146/hp/device/webAccess/open_accounting.xml", "t:\open_accounting_1.xml",0,0)
Debug "OK 2"
Else
Debug "Fehler 2"
EndIf
Aber es macht beim Download keinen Effekt. Das dieses Problem an den Daten liegt, könnte sein, aber warum geht es mit der API Funktion? Und was soll ich machen, ich brauche diese Daten und mit Inetget per Autoit war dies nie ein Problem. Ich würde nur gerne auf Purebasic umstellen…
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:33
von kunstlust
Mit anderen Daten aus dem Internet oder so geht es mit beiden Befehlen, was ja auch nicht anders zu erwaten war...
Noch einer Idee?
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:36
von ts-soft
Du kannst es mal hiermit probieren:
Code: Alles auswählen
Procedure.s RemoteXMLString(url.s, buffersize.l = 1024, timeout.l = 3000)
; by edel
; modified by kiffi
; modified by ts-soft
Protected cid.l, pos.l, headerlen.l, NetEvent.l, Buffer.l
Protected server.s, file.s, Header.s, response.s
url = LCase(url)
RemoveString(url, "http://", 1, 1)
pos = FindString(url, "/", 0)
If pos = 0
server = url
file = "/"
Else
server = Left(url, pos - 1)
file = Right(url, Len(url) - pos + 1)
EndIf
cid = OpenNetworkConnection(server, 80, #PB_Network_TCP)
If cid
Header = "GET "+ file + " HTTP/1.0" + #CRLF$
Header + "Host: " + server + #CRLF$
Header + "Accept: */*" + #CRLF$
Header + "Connection: close" + #CRLF$ + #CRLF$
SendNetworkString(cid, Header)
Buffer = AllocateMemory(buffersize)
timeout + ElapsedMilliseconds()
Repeat
NetEvent = NetworkClientEvent(cid)
If NetEvent = #PB_NetworkEvent_Data
Repeat
headerlen = ReceiveNetworkData(cid, Buffer, buffersize)
response + PeekS(Buffer, headerlen, #PB_UTF8)
Until headerlen = 0
FreeMemory(Buffer)
pos = FindString(response, #CRLF$ + #CRLF$, 0) - 1
pos = Len(#CRLF$ + #CRLF$) + pos
pos = FindString(response, "<", pos) - 1
response = Mid(response, pos, Len(response) - pos - 1)
CloseNetworkConnection(cid)
ProcedureReturn response
EndIf
If timeout < ElapsedMilliseconds()
CloseNetworkConnection(cid)
ProcedureReturn ""
EndIf
ForEver
CloseNetworkConnection(cid)
EndIf
If Buffer
FreeMemory(Buffer)
EndIf
ProcedureReturn ""
EndProcedure
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:55
von kunstlust
An ts-soft:
Ich habe bei Server und File die Daten eingetragen, es passiert aber nichts, was mache ich falsch? Ich bin noch Anfänger und verstehe es leider nicht auf Anhieb. Kannst du mir bitte noch einen Tip geben? Danke
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 15:57
von kunstlust
Ich hatte es zuvor so versucht...
Code: Alles auswählen
InitNetwork()
#BufferLength = 4096
Define response.s, time.i, Event.i, Size.i, header.s, content.s = "random=stuff&hans=peter", timeout.i = 50000
Define url.s = "http://192.168.110.146/hp/device/webAccess/open_accounting.xml"
Define Host.s = GetURLPart(url, #PB_URL_Site)
Define Path.s = GetURLPart(url, #PB_URL_Path)
Define ConnectionID = OpenNetworkConnection(Host, 80)
If ConnectionID
Define *Buffer, ReceivedLength.i
header = "POST /"+Path+" HTTP/1.1" + #CRLF$
header + "Host: "+Host + #CRLF$
header + "Connection: close" + #CRLF$
header + "Accept: */*" + #CRLF$
header + "Content-type: application/x-www-form-urlencoded" + #CRLF$
header + "Content-length: " + Str(Len(content)) + #CRLF$+ #CRLF$
header + content + #CRLF$
SendNetworkString(ConnectionID, header)
Time = ElapsedMilliseconds()
Repeat
Delay(10)
Event = NetworkClientEvent(ConnectionID)
Until Event Or ElapsedMilliseconds()-Time > timeout
If Event
Repeat
*Buffer = ReAllocateMemory(*Buffer, ReceivedLength+#BufferLength)
Size = ReceiveNetworkData(ConnectionID, *Buffer+ReceivedLength, #BufferLength)
If Size > 0
ReceivedLength + Size
EndIf
Until Size <= 0
ReAllocateMemory(*Buffer, ReceivedLength)
EndIf
EndIf
For k = o To 289
PokeC(*Buffer+k,32)
Next
If CreateFile(0, "t:\open_accounting.xml")
WriteString(0, PeekS(*Buffer))
CloseFile(0)
Else
Debug "Konnte die Datei nicht erstellen!"
EndIf
Re: Http URLDownloadToFile Windows
Verfasst: 16.04.2012 16:03
von ts-soft
Da Du von einem lokalen Webserver lädtst, kann hier keiner testen.