Http URLDownloadToFile Windows

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Http URLDownloadToFile Windows

Beitrag 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

Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Http URLDownloadToFile Windows

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Http URLDownloadToFile Windows

Beitrag von STARGÅTE »

Dein Code ist falsch!

Code: Alles auswählen

If Wert = Funktion()
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:

Code: Alles auswählen

Wert = Funktion()
If Wert...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Http URLDownloadToFile Windows

Beitrag 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?
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Http URLDownloadToFile Windows

Beitrag 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…
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Http URLDownloadToFile Windows

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Http URLDownloadToFile Windows

Beitrag 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


PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Http URLDownloadToFile Windows

Beitrag 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
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Http URLDownloadToFile Windows

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Http URLDownloadToFile Windows

Beitrag von ts-soft »

Da Du von einem lokalen Webserver lädtst, kann hier keiner testen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten