IdHTTP - cache?

IdHTTP - cache?


Oglądasz wersję archiwalną tematu "IdHTTP - cache?" z forum pl.comp.lang.delphi




SuperMann
26 Paź 2006, 08:49
Witam,
mam problem z komponentem Indy IdHTTP. Uzywam go do pobrania ze strony NBP  
aktualnego kursu Euro.
Jak wiadomo NBP aktualizuje strone http://www.nbp.pl/Kursy/KursyA.html  
dopiero kolo poludnia i gdy klikne przycisk jeszcze przed poludniem gdy  
kurs jest jeszcze stary to moge zapomniec o aktualnym kursie z  
dzisiejszego dnia nawet jezeli bede probowal ja pobrac 2-3 godziny  
pozniej. Caly czas pobierac mi bedzie strone z przedpoludnia. Czy da sie  
jakos wylaczyc ten cache w IdHTTP?

Pozdrawiam
SuperMann


kf
26 Paź 2006, 09:31

pozniej. Caly czas pobierac mi bedzie strone z przedpoludnia. Czy da sie
jakos wylaczyc ten cache w IdHTTP?



A po co pobierasz HTML'a ?
Pobieraj kursy w XML i bedziesz mial wszystkie problemy rozwiazane.

kf

SuperMann
26 Paź 2006, 09:52

A po co pobierasz HTML'a ?
Pobieraj kursy w XML i bedziesz mial wszystkie problemy rozwiazane.



Tez o tym myslalem, ale i tak wiaze sie to z pobraniem HTMLa zeby wyluskac  
adres XML'a bo nie znam algorytmu generowania tego adresu z xml'em  
(a208z061025.xml). Domyslam sie ze koncowka to data, ale jak przewidziec  
jaka liczba jest po "a"? To raczej nie jest dzien roku.

kf
26 Paź 2006, 10:38

(a208z061025.xml). Domyslam sie ze koncowka to data, ale jak przewidziec
jaka liczba jest po "a"? To raczej nie jest dzien roku.



Ta liczba to kolejny numer tableli kursow. Nazwa pliku jest przez caly dzien
stala - wiec nie ma problemu
z tym zeby ja pobrac z htmla

kf


DarekM
26 Paź 2006, 10:41


| A po co pobierasz HTML'a ?
| Pobieraj kursy w XML i bedziesz mial wszystkie problemy rozwiazane.

Tez o tym myslalem, ale i tak wiaze sie to z pobraniem HTMLa zeby
wyluskac adres XML'a bo nie znam algorytmu generowania tego adresu z
xml'em (a208z061025.xml). Domyslam sie ze koncowka to data, ale jak
przewidziec jaka liczba jest po "a"? To raczej nie jest dzien roku.



jest to kolejny numer tabeli w danym roku,
czyli musisz odliczyć dni wolne i inne dni w których nie ma publikacji kursu
ja to robię w ten sposób, że sprawdzam kilka wartości aż trafię (szacuję
numer po odliczeniu niedziel i kilku innych dni)

Darek

marcin.rosiek@gmail.com
27 Paź 2006, 04:23


| A po co pobierasz HTML'a ?
| Pobieraj kursy w XML i bedziesz mial wszystkie problemy rozwiazane.

| Tez o tym myslalem, ale i tak wiaze sie to z pobraniem HTMLa zeby
| wyluskac adres XML'a bo nie znam algorytmu generowania tego adresu z
| xml'em (a208z061025.xml). Domyslam sie ze koncowka to data, ale jak
| przewidziec jaka liczba jest po "a"? To raczej nie jest dzien roku.
jest to kolejny numer tabeli w danym roku,
czyli musisz odliczyć dni wolne i inne dni w których nie ma publikacji kursu
ja to robię w ten sposób, że sprawdzam kilka wartości aż trafię (szacuję
numer po odliczeniu niedziel i kilku innych dni)

Darek



Czesc,

Kiedys znalazlem taki sposob na poznanie nazwy XML'a z kursami walut:

const cUrl = 'http://www.nbp.pl/Kursy/xml/dir.txt';
URLDownloadToFile(nil, PChar(cUrl), PChar(aFileName), 0, nil);

potem możemy wczytać sobie listę tabel kursów z pliku np do
tStringList,
wybrać tabele których nazwa zaczyna się od 'A'.
Ostatnia tabela w pliku powinna być najbardziej aktualna, ale mając
już wszystkie nazwy, łatwo jest wybrać najnowszą tabele.
Data z kiedy jest tabela jest zaszyta w nazwie pliku, ale też jest w
treści XML'a.

Oczywiście można dyskutować czy jest to najbardziej optymalny
sposób - w porównaniu np. do obliczania numeru pomijając dni wolne.
Ale IMHO jest to najbardziej pewny sposób aby uniknąć
niebezpieczeństwa że po wprowadzeniu jakiś nowych świąt
państwowych nasz algorytm stanie się bezużyteczny :-)

Pozdrawiam
Marcin

SuperMann
27 Paź 2006, 06:16

wystarcza.
Oczywiscie mozna go zoptymalizowac, ale to juz inna bajka.

Pozdrawiam
SuperMann

----------------------------
unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,  
Forms,
   Dialogs, StdCtrls, DateUtils, xmldom, XMLIntf, msxmldom, XMLDoc, WinINet,
   ComCtrls;

type
   TForm1 = class(TForm)
     Button1: TButton;
     Label1: TLabel;
     DateTimePicker1: TDateTimePicker;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
     function kurs_z_dnia(data_kursu: TDateTime): Currency;
     function IsUrlValid(url: string): boolean;
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.kurs_z_dnia(data_kursu: TDateTime): Currency;
var
   dzien_roku, nr_tabeli, nr_tabeli1: integer;
   nazwa_pliku: string;
   XML1: TXMLDocument;
   strona: string;
   pelna_nazwa: string;
   blad: boolean;
   Noga1: IXMLNode;
   kod_walutyt, kurst: string;
begin
   result:= 0;
   dzien_roku:= DayOfTheYear(data_kursu);
   nr_tabeli1:= trunc(dzien_roku - (2 * (dzien_roku / 7)));
   nr_tabeli:= nr_tabeli1;
   XML1:= TXMLDocument.Create(self);
   blad:= true;
   try
     while (blad) and ((nr_tabeli1-15)<nr_tabeli) do begin
         pelna_nazwa:= 'http://www.nbp.pl/Kursy/xml/' + 'a'  
+ Format('%0.3d', [nr_tabeli]) + 'z' + FormatDateTime('yyMMdd',  
data_kursu) + '.xml';
         blad:= not (poprawnyURL(pelna_nazwa));
         Application.ProcessMessages;
         dec(nr_tabeli);
       end;
     if not (blad) then begin
         XML1.FileName:= pelna_nazwa;
         XML1.Active:= true;
         Noga1:= XML1.DocumentElement.ChildNodes.FindNode('pozycja');
         while (Noga1<nil) and (kod_walutyt<'EUR') do begin
           kurst:= Noga1.ChildNodes['kurs_sredni'].Text;
           kod_walutyt:= Noga1.ChildNodes['kod_waluty'].Text;
           Noga1:= Noga1.NextSibling;
         end;
         if (kurst<'') then result:= StrToFloat(kurst) else result:=0;
       end else
         MessageBox(0, 'Brak kursu z wybranego dnia.', 'Błąd', MB_OK or  
MB_ICONERROR);
   except
     MessageBox(0, 'Błąd połączenia z serwerem NBP.', 'Błąd', MB_OK or  
MB_ICONERROR);
   end;
   XML1.Free;
end;

function TForm1.poprawnyURL(url: string): boolean;
var
   hSession, hfile, hRequest: hInternet;
   dwindex, dwcodelen: dword;
   dwcode: array[1..20] of char;
   res: pchar;
begin
   if pos('http://', lowercase(url)) = 0 then
     url:= 'http://' + url;
   Result:= false;
   hSession:= InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,  
nil, nil, 0);
   if assigned(hsession) then begin
       hfile:= InternetOpenUrl( hsession, pchar(url), nil, 0,  
INTERNET_FLAG_RELOAD, 0);
       dwIndex:= 0;
       dwCodeLen:= 10;

dwIndex);

       result:= (res = '200') or (res = '302');
       if assigned(hfile) then
         InternetCloseHandle(hfile);
       InternetCloseHandle(hsession);
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Label1.Caption:= FloatToStr(kurs_z_dnia(DateTimePicker1.DateTime));
end;

end.

DarekM
27 Paź 2006, 11:48



| A po co pobierasz HTML'a ?
| Pobieraj kursy w XML i bedziesz mial wszystkie problemy rozwiazane.
| Tez o tym myslalem, ale i tak wiaze sie to z pobraniem HTMLa zeby
| wyluskac adres XML'a bo nie znam algorytmu generowania tego adresu z
| xml'em (a208z061025.xml). Domyslam sie ze koncowka to data, ale jak
| przewidziec jaka liczba jest po "a"? To raczej nie jest dzien roku.
| jest to kolejny numer tabeli w danym roku,
| czyli musisz odliczyć dni wolne i inne dni w których nie ma publikacji kursu
| ja to robię w ten sposób, że sprawdzam kilka wartości aż trafię (szacuję
| numer po odliczeniu niedziel i kilku innych dni)

| Darek

Czesc,

Kiedys znalazlem taki sposob na poznanie nazwy XML'a z kursami walut:

const cUrl = 'http://www.nbp.pl/Kursy/xml/dir.txt';
URLDownloadToFile(nil, PChar(cUrl), PChar(aFileName), 0, nil);



rewelacja,
NBP mogło by oficjalnie udostępniać tą stronę

potem możemy wczytać sobie listę tabel kursów z pliku np do
tStringList,
wybrać tabele których nazwa zaczyna się od 'A'.
Ostatnia tabela w pliku powinna być najbardziej aktualna, ale mając
już wszystkie nazwy, łatwo jest wybrać najnowszą tabele.
Data z kiedy jest tabela jest zaszyta w nazwie pliku, ale też jest w
treści XML'a.

Oczywiście można dyskutować czy jest to najbardziej optymalny
sposób - w porównaniu np. do obliczania numeru pomijając dni wolne.
Ale IMHO jest to najbardziej pewny sposób aby uniknąć
niebezpieczeństwa że po wprowadzeniu jakiś nowych świąt
państwowych nasz algorytm stanie się bezużyteczny :-)



Odpytywać musisz zawsze, gdyż nie wiadomo co będzie pominięte/dodane
więc twój sposób będzie tak długo poprawny, jak długo NBP będzie
aktualizował ten plik, ale jak widać robi to już kilka lat.
Równie dobrze może zmienić ścieżkę dostępu.

Darek

Mafie rzadzace
programy na zamowienie.
takie tam powiedzonka...
pomysl na metro...
Czy da się dojść z PKP Okęcie na Kłobucką?
samotni
Peep shows w Warszawie
  • ogloszenia jelenia gora
  • przygarne zaadoptuje kastrata
  • dole gudbrandsdal
  • green street hooligans music
  • a4 tech navigator opto radio
  • dieta chorych na trzustke 180
  • centrum filmowe atv
  • edytor kalisz
  • zabic;francisa;czy;derricka
  • Zestaw wiadomości z grup dyskusyjnych @@ Start