Etykiety

linux (14) php (14) Laravel (9) mysql (9) Hardware (8) Windows (6) sieci (5) PowerShell (4) software (4) MariaDB (3) apache (3) html (3) Microsoft (2) bezpieczeństwo LAN (2) cygwin (2) Akcesoria (1) CMS (1) Laptop (1) Open Office (1) drupal 7 (1) gpg (1) hosting (1) jquery (1) sieci LAN (1) xml (1) zabezpieczenie sieci LAN (1)

niedziela, 24 lipca 2016

Jak automatycznie pobierać kursy walut NBP ?

Automatyczne pobieranie kursów poszczególnych walut z sieci to niekiedy złożone zadanie, z którym jednak każdy zawodowy twórca systemów informatycznych prędzej czy później musi się zmierzyć.
W niniejszym artykule, który przeznaczony jest dla średnio zaawansowanych i zaawansowanych programistów, chciałbym przestawić uproszczoną wersję opracowanej przeze mnie i wielokrotnie zastosowanej w wielu środowiskach produkcyjnych, metodę pobierania z sieci średniego kursu danej waluty z wybranej daty oraz automatycznego wstawiania tej wartości do formularza HTML w aplikacjach web.

Kursy walut z API NBP
Kursy walut dla aplikacji web - API NBP - Jak to działa


Jak dobrze wiadomo, w aplikacjach o charakterze finansowym, bądź biznesowym, dość często pojawia się konieczność wpisywania aktualnego kursu danej waluty do przetwarzanego na serwerze formularza. Po co więc za każdym razem wchodzić na witrynę Narodowego Banku Polskiego NBP, szukać tam tabeli kursów z danego dnia, odczytywać z niej wartości i przepisywać, bądź kopiować i wklejać do formularza, skoro można w sposób w pełni zautomatyzowany pobierać wartości kursów i wstawiać je do fomularza web za jednym wciśnięciem przycisku? Zautomatyzowane rozwiązanie może okazać się bardzo przydatne, szczególnie w przypadku konieczności codziennego, częstego odczytu wartości kursów walut, np. w aplikacjach web związanych z eksportem i fakturowaniem.
Przedstawiona tutaj metoda automatycznego pobierania średniego kursu Euro, obowiązującego dla konkretnej daty, wymaga zastosowania zarówno skryptów jQuery - po stronie przeglądarki - jak i skryptów php po stronie serwera oraz uproszczonego, przykładowego kodu html, koniecznego do osadzenia w nim formularza.
Chciałbym z góry zaznaczyć, że działającym przykładem zastosowania przedstawionego tutaj rozwiązania jest witryna Kursy Walut mojego autorstwa.

Założenia wstępne


Przedstawiony w niniejszym artykule przykład jest zupełnie "nagi" i ma służyć jedynie jako materiał szkoleniowy. Nie zastosowałem w nim żadnych dodatkowych funkcji, oprócz tych, które są niezbędne do zwyczjnego zadziałania mechanizmu. Aby jednak mechanizm mógł mieć zastosowanie w środowisku produkcyjnym, powinien on zostać opatrzony przez programistę w należyte środki bezpieczeńśtwa.

Skąd pobierać kursy walut?


Jedynym wiarygodnym źródłem kursów walut jest Narodowy Bank Polski. Jak powszechnie wiadomo, NBP od bardzo dawna udostępnia na swojej oficjalnej witrynie tabele kursów walut. Od dość niedawna jednak została uruchomiona dodatkowa poddomena NBP http://api.nbp.pl/, pod którą są umieszczane kursy walut w formatach .xml oraz .json dla celów programistycznych. Stąd właśnie będziemy pobierać kursy dla celów przedstawionego tutaj przykładu. Pliki API NBP są generowane po stronie serwera NBP, w sposób zależny od zapytania HTTP wysłanego przez klienta. Warto wstępnie zapoznać się z różnymi, możliwymi parametrami zapytań: http://api.nbp.pl/#kursyParams. Wstępne zapoznanie się z instrukcjami znajdującymi się w witrynie API NBP znacznie ułatwi zrozumienie mojego przykładu.

Jak to działa?


Pod adresem http://api.nbp.pl/api/exchangerates/rates/A/EUR/ znajdują się dane aktualnie obowiązującego średniego kursu Euro. Aby jednak uzyskać informacje dotyczące kursu Euro dla konkretnie wybranej daty, należy dołączyć datę do zapytania, np. http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22
Należy zwrócić uwagę na fakt, iż możemy w ten sposób uzyskać pliki z danymi kursów, zarówno w formacie JSON jak i XML. Aby zrobiło się trochę ciekawiej, w niniejszym przykładzie posługuję się formatem XML!

Aby uzyskać informacje o kursach w formacie XML należy dodać odpowiedni parametr do naszego przykładowego zapytania: http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22?format=xml

Gdy klikamy w przycisk "Pobierz i wstaw" w formularzu, którego źródło HTML przedstawiam poniżej, osadzony w sekcji HEAD kod jQuery wywołuje skrypt php api_nbp_tab_A_xml.php, przekazując mu interesującą nas datę w zmiennej $_POST. Skrypt php sprawdza czy szukany przez nas plik xml istnieje w lokalnym katalogu, a jeśli nie, to stara się go uzyskać ze zdalnego serwera NBP. Jeśli plik ze średnim kursem naszej przykładowej waluty, dla wybranej daty, nie został już uprzednio skopiowany na nasz lokalny katalog, skrypt php api_nbp_tab_A_xml.php stara się odnaleźć takowy zdalny plik kursu średniego Euro dla wybranej przez nas daty, wywołując odpowiednie zapytanie HTTP. Jeśli plik zostaje odnaleziony na zdalnym serwerze, skrypt php kopiuje go do lokalnego katalogu /xml, jeśli natomiast plik nie zostaje odnaleziony, wówczas skrypt zwraca odpowiedni komunikat.

W kolejnym etapie skrypt jQuery wysyła lokalne zapytanie XMLHttpRequest, tworząc objekt tej klasy, w celu odniesienia się do ewentualnie skopiowanego lokalnego pliku, po czym, jeśli odpowiedź lokalnego sewera jest pozytywna i plik jest "gotowy" - czyli mamy:
xhttp.readyState == 4 && xhttp.status == 200
, wówczas następuje przetwarzanie zawartości pliku poprzez funkcje getRates() i wydobywanie z niego interesujących nas wartości, które są wstawiane do formularza poprzez:
$("#kurs_euro1").val(rateInt);
$("#kurs_euro2").val(rateDec);
$("#kurs-result").html(tab);
$("#tabela_nbp").val(tab);


Formularz HTML




CSS



Kod jQuery




Skrypt PHP


Oto zawartość wywoływanego przez powyższy kod jQuery skryptu api_nbp_tab_A_xml.php:
define('XML_FILES_PATH', $_SERVER['DOCUMENT_ROOT']."xml/");

function isValidDate($date) {
$d = DateTime::createFromFormat('Y-m-d', $date);
return $d && $d->format('Y-m-d') === $date;
}

function URL_exists($url){
$headers=get_headers($url);
return stripos($headers[0],"200 OK")?true:false;
}

// Jeżeli data jest prawidłowa
if (isValidDate($_POST['data'])) {

// Jeżeli plik xml jeszcze nie istnieje w lokalnym katralogu
if(!file_exists(XML_FILES_PATH.$_POST['data'].".xml")) {

// Jeżeli istnieje dokument xml
if(URL_exists("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml")) copy("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml", XML_FILES_PATH.$_POST['data'].".xml");
else die('Tabela nie została odnaleziona!');

if (file_exists(XML_FILES_PATH.$_POST['data'].".xml")) die('Zaimportowano tabelę!'); else die('Proba zaimportowania tabeli nie powiodła się!');

} else die('Tabela istnieje!');

} else die('Proszę wybrać datę!'); -


Działający przykład


Działający przykład przedstawionej tutaj metody można przetestować pod adresem http://kursy-walut.info


Czy artykuł okazał się pomocny?


Jeśli artykuł spodobał się lub okazał się pomocny uprzejmie proszę o udostępnianie go w sieci. W razie pytań służę pomocą. Proszę o komentarze.