Najlepszy sposób aby pobrać kursy walut w programie c# WPF

0

Cześć, mam program C# WPF i chciałbym jednym przyciskiem pobrać aktualny kurs, dolara i euro.
Możecie mi doradzić jaki najlepszy i najprostszy zastosować sposób?
Myślałem o użyciu web scrapingu, ewentualnie może httpClient ewentualnie lub może jakieś API lub może coś zupełnie innego uważacie, że bedzie lepsze do pobierania takich danych. Będę wdzięczny za cenne wskazówki

0

Ale jakis konkretny kurs czy NBP? Jak NBP to oni wystawiaja plik jak dobrze pamietam albo spokjnie mozesz przeskrapowac ich stronę.

0

@S4t: średni kurs danej waluty. Chciałbym aby mój program miał orientacyjny kurs danej waluty w danym dniu.
@666 tak znalazłem to API ale dzięki.

Myślicie, że podpięcie API będzie najprostszym sposobem. Jeżeli nie API to jaki sposób inny zastosować ?

4

Użycie API nbp to jakieś 20 wierszy kodu doprawdy szukasz czegoś łatwiejszego?

1
Ted07 napisał(a):

Myślicie, że podpięcie API będzie najprostszym sposobem. Jeżeli nie API to jaki sposób inny zastosować ?

Będzie najprostsze.

A powiedz (sam sobie) co wspólnego ma pobieranie kursów z tym, ze używasz WPF?
Dopóki nie zaczniesz rozdzielać zagadnień, będzie miał przed sobą ścianę problemów jak spychacz.

Co do kursów, szanowny programisto / szanowni programiści , to najpierw określamy CZYJ kurs (bo wcale nie musi być NBP, pierwszy z brzegu to EBR i banki komercyjne - w komercyjnych zwykle nie ma średniego), oraz JAKI (średnie, sprzedaży, zakupu - ale wynalazł by i inne, w innych tabelach itd...).
Za zadanie pytania o "kurs" biznes by wyśmiał - i dlatego jest biznesem, a my mu buty wiążemy.

  1. BTw zwykle przydatność średniego jest d/d - niemal nic w realnym biznesie wg niego się nie dzieje.
0

@ZrobieDobrze: tak mass rację nie potrzebnie dodawałem informacje o WPF, bo nie ma to wpływu na to w czym mam napisany ten program.

BTW @ZrobieDobrze, (bo widzę że jesteś dobrze obeznany w temacie) jak rownież do innych.
Nie pisałem jeszcze programu z użyciem jakiegokolwiek API i nie wiem za bardzo jak go zaimplementować do programu. Na stronie NBP jest co prawda informacja o API i są podane jakieś linki. Zastanawiam się czy wystarczy ten link wkleić do programu czy trzeba go jakoś zmodyfikować? Znalazłem też informacje, że trzeba link pobrać i przekonwertować do jsona np. na stronie json2csharp.
Możecie mi przedstawić dokładnie krok po kroku jakie musze wykonać abym dodał to API ze strony NBP do mojego programu???
@ZrobieDobrze liczę na ciebie ;-)

3

Modelujesz klasy (tutaj to są proste klasy: kurs, tabela - chodzi o to, abyś dane z Web API miał do czego przyjąć, masz mieć odpowiedniość 1:1) i używasz np RestSharp (proste kilkulioniowe sample)./
Niestety na zamodelowanie, jak nigdy nie robiłeś, musisz się przyłożyć na naukę. Ale jak na Web API, to naprawdę prosty temat, powiedziałbym, że o ile się uczyć Web API, to to jest dobry case.

Niestety wędka, rybę łowisz sobie sam.

0

@ZrobieDobrze: dziękuję za chęć pomocy ale bez pomocy nie ruszę z tematem.

To co mam zrobione: Ze strony NBP pobrałem llink do XML (Przykłady zapytań -> Kursy walut -> frank szwajcarski)
Aktualnie obowiązujący kurs średni waluty CHF
http://api.nbp.pl/api/exchangerates/rates/a/chf/
Po wejściu na podany link pojawia się plik w XML. Po konwersji pliku z XML do json otrzymałem poniższy wpis:
{"table":"A","currency":"frank szwajcarski","code":"CHF","rates":[{"no":"156/A/NBP/2022","effectiveDate":"2022-08-12","mid":4.8318}]}
i przekonwertowałem ten wpis na :

public class Rate
    {
        public string no { get; set; }
        public string effectiveDate { get; set; }
        public double mid { get; set; }
    }

    public class Root
    {
        public string table { get; set; }
        public string currency { get; set; }
        public string code { get; set; }
        public List<Rate> rates { get; set; }
    }

W programie C# utworzyłem nową class i umieściłem tam powyższy wpis.

Jednak i w tym momencie moja wiedza się kończy i nie wiem co robić dalej.
Może ktoś pomorze i udzieli jasnej podpowiedzi.

0

Przekonwertowałeś tzn? Zdeserializowałeś jsona ?

2

utwórz sobie HttpClienta (najlepiej używając IHttpClientFactory) i jedna linia kodu:

var kurs = await httpClient.GetFromJsonAsync<Root>("http://api.nbp.pl/api/exchangerates/rates/a/chf/?format=json");

wyświetlasz np:

Console.WriteLine(kurs.rates[0].mid);

typ effectiveDate zamień ze stringa na DateTime, będzie Ci łatwiej.

Btw - mam nadzieję że nie tworzyłeś tych klas ręcznie. Wystarczy skopiować JSONa i użyć Edycja -> Wklej specjalne -> Wklej dane JSON jako klasy

0

@gswidwa1: na stronie json2csharp umieściłem link xml i otrzymałem kod w C#.

Convert Json to C# Classes Online
Convert any JSON object to a C# class online. Check out the help panel below to view details on how to use this converter.

Może ty mi odpowiesz czy to było przekonwertowanie czy zdeserializowałnie jsona?

Dla mnie bardziej istotne jest w jaki sposób użyć w programie wygenerowany kod aby działał program.

public class Rate
{
    public string no { get; set; }
    public string effectiveDate { get; set; }
    public double mid { get; set; }
}

public class Root
{
    public string table { get; set; }
    public string currency { get; set; }
    public string code { get; set; }
    public List<Rate> rates { get; set; }
}

@obscurity: dziękuję za cenne wskazówki, spróbuję napisać ten program wg. twoich wskazówek.

0

@_13th_Dragon: dziękuję za wskazanie bardzo podobnego programu na GitHubie.

Rozpocząłem analizę kodu i widzę, że co najmniej połowa kodu nie jest dla mnie zrozumiała.
Próbuję choć wyłuskać te elementy, które stanowią sedno API NBP.

Dziękuję wszystkim za pomoc.

1

Zalinkowany kod robi dokładnie to samo co kody w tym wątku tylko używa przestarzałego HttpRequest, osobno deserializuje stringi i pokazuje rezultaty w tabelce. Nie potrzebujesz tego wszystkiego. Cały działający kod już dostałeś w tym wątku:

var httpClient = new HttpClient(); // lepiej by było użyć statycznej instancji lub IHttpClientFactory
var kurs = await httpClient.GetFromJsonAsync<Root>("http://api.nbp.pl/api/exchangerates/rates/a/chf/?format=json");

public class Rate
{
    public string no { get; set; }
    public string effectiveDate { get; set; }
    public double mid { get; set; }
}

public class Root
{
    public string table { get; set; }
    public string currency { get; set; }
    public string code { get; set; }
    public List<Rate> rates { get; set; }
}

to jest cały kod jaki potrzebujesz, z czym konkretnie masz problem?

0

@obscurity: dziękuję Ci, że próbujesz mnie jeszcze wesprzeć ;-) tak ten programik i jego kod mnie trochę zaskoczył i nie mogłem się połapać co jest co. Rozumiem, czyli to jest materiał który stanowi trzon API NBP. Dostosuję go do swojego programu i napiszę jak mi poszło. Dzięki Obscurity ;-)

0

@obscurity: otworzyłem nowy projekt konsolowy, przekopiowałem cały powyższy kod. Po uruchomieniu program działa, nie wywala żadnych błędów. Myślę, że to jest dobry znak.
Rozumiem, że teraz muszę dodać kod typu Console.Writline("Podaj datę") oraz Console.ReadLine() itd. data, szukana waluta itd. Takie dane aby program mógł coś zwrócić.

W powyższym wpisie podpowiedziałeś mi aby użyć:
Console.WriteLine(kurs.rates[0].mid);

I teraz działa, wyświetla się aktualny kurs.
Teraz jak działa program będę mógł poeksperymentować z kodem.

Mam tylko pytanie, te parametry poniżej są pobierane czy ja powinienem je podawać (no, effectiveDate, mid, table, currency, code)???
public class Rate
{
public string no { get; set; }
public string effectiveDate { get; set; }
public double mid { get; set; }
}

public class Root
{
public string table { get; set; }
public string currency { get; set; }
public string code { get; set; }
public List<Rate> rates { get; set; }
}

0

Na stronie API NBP znalazłem jeszcze link nie do walut ale do ceny złota i teraz próbuję zmienić program tak aby wyświetlał aktualne ceny tego kruszcu.
Zapytania o ceny złota
Ceny złota
Aktualnie obowiązująca cena złota
http://api.nbp.pl/api/cenyzlota/

Analizuję link podany do pobierania kursu danej waluty i staram się przenieść te poprawki na Aktualnie obowiązująca cena złota
http://api.nbp.pl/api/cenyzlota/
Choć nie jest to takie proste i typ kalka nie działa.

0
_13th_Dragon napisał(a):

https://github.com/lukasz-cz/kursy-walut-nbp

Kliknąłem w ten project ... o wiele słabszy niż bym się spodziewał o "rekomendowanym" projekcie.
Dużo kodu w stylu "z rozpaczy 3 dni przed deadline", ogromnie obszerny, a tylko dlatego, ze złe narzędzia / założenia wyjściowe itd ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1