Web Service, obsługa XML

0

Cześć,

Ostatnio dostałem zadanie z gwiazdką. Mam zbudować Web Service w C++ Builder (REST). I tutaj pierwsze pytanie do Państwa.
Czy możecie polecić jakieś fajne materiały na ten temat (oczywiście sam staram się ogarniać temat na google i youtube)?

Obecnie zaczynam rozkminiać temat i jestem na etapie utworzenia klienta którym odpytuję jakąś stronkę (w moim przypadku OpenWeatherMap) i otrzymuję odpowiedź w postaci XML, i tutaj wszystko działa bez zarzutu. Natomiast nie wiem kompletnie jak obsłużyć tego XML tzn. sparsować go, wyciągnąć z niego interesujące mnie informacje i np. wrzucić je do bazy?! Proszę o jakieś podpowiedzi.

i ostatnie pytanie (jak na razie). Jak sprawdzić jakie zapytanie idzie z klienta do serwisu? Korzystam na razie z komponentów RESTClient, RESTRequest i RESTResponse. W RESTClient w BaseURL ustawiem bazowy adres a w Request ustawiam kilka parametrów ale jak podejżeć jakie kompletne zapytanie idzie do serwisu (bazeURL + parametry)?

pozdrawiam

1

Nie jestem programistą C++ więc przyszedłem tu sobie tylko ponarzekać
W twoim pytaniu jest kilka nieścisłości:

  1. Najpierw piszesz że Web Service, obsługa XML (co jednoznacznie kojarzy mi się z SOAP), a potem piszesz że REST (REST prawie zawsze używa JSONa chociaż teoretycznie może XMLa) - ten punkt to tylko moje marudzenie
  2. a teraz na poważnie, jestem na etapie utworzenia klienta - to budujesz serwis/webservis/microservis czy klienta do odpytywania bo się pogubiłem?
  3. Natomiast nie wiem kompletnie jak obsłużyć tego XML - a skąd my mamy to wiedzieć? co jest napisane w zadaniu?
  4. Jak sprawdzić jakie zapytanie idzie z klienta do serwisu? dobry system ma zwykle wdrożone logowanie i tam się odkłada takie dane
0
Kamil Żabiński napisał(a):

Nie jestem programistą C++ więc przyszedłem tu sobie tylko ponarzekać

Czy C++ Builder to jeszcze C++, pozostaje pytaniem otwartym. :)

0

Może rzeczywiście piszę trochę nieskładnie, bo jak pisałem jestem w temacie totalnie początkujący, więc mam prawo trochę "pływać" :)
To może uporządkujmy.
mam napisać web serwis który będzie pośrednikiem w wymianie danych pomiędzy dwoma systemami (w postaci REST) i oczywiście zmodyfikować jeden z nich żeby wysyłał zapytanie w postaci XML do systemu docelowego i obsługiwać odpowiedzi w postaci XML z sys. docelowego, czyli jeżeli dobrze rozumiem trzeba napisać web serwis od początku, żeby potrafił odebrać zapytanie od klienta i wysłać ją do systemu docelowego i żeby potrafił odebrać odpowiedź od systemu docelowego i przesłać ją klientowi (tak to rozumiem jeżeli coś pokręciłem to mnie poprawcie) . Dodatkowo muszę zmodyfikować klienta, czyli system źródłowy, który ma wysyłać do web serwisu zapytania i obsługiwać odpowiedzi od niego.

Jak zacząłem googlać temat trafiłem na filmik który przedstawia tworzenia takiego małego klienta który odpytuje serwis OpenWeatherMap o pogodę dla danej lokalizacji. Obejrzałem i zrobiłem to co w nim przedstawiono i wszystko wyszło OK. Potrafię odpytać to API i otrzymuję odpowiedź w postaci XML. Teraz chciałbym się nauczyć jak odczytać i wyciągnąć interesujące mnie dane z tego XML-a i dalej je wykorzystać, czy to wrzucić na jakiegoś grida czy do bazy, to już jest sprawa drugorzędna.

I chodziło mi właśnie o to że może ktoś się już z czymś takim spotkał i da jakieś wskazówki.
W międzyczasie natrafiłem na jakąś bibliotekę XMLParser ale nie potrafię jej dodać do C++Builder-a mimo że piszę że się da. Link: http://www.destructor.de/xmlparser/doc.htm
Może ktoś miał doświadczenie z inną biblioteką, łatwą w użytkowaniu i może coś podpowiedzieć :) z co z góry dzięki

pozdro

0

C++ jako język pozbawiony refleksji nadaje się bardzo słabo do tego celu

1
AnyKtokolwiek napisał(a):

C++ jako język pozbawiony refleksji nadaje się bardzo słabo do tego celu

A wiesz o tym, że dedykowane dla Scali biblioteki do JSONa nie używają refleksji? Dzięki temu są szybsze i wydajniejsze. Wystarczy dla każdej klasy danych utworzyć funkcję mapującą i konstruktor ze wszystkimi parametrami. Bibliotek C++ nie znam, ale brak refleksji jeszcze nie jest przeszkodą w pisaniu czegoś takiego. Bardziej bym się martwił wyciekami pamięci

1
forritarik napisał(a):

Potrafię odpytać to API i otrzymuję odpowiedź w postaci XML. Teraz chciałbym się nauczyć jak odczytać i wyciągnąć interesujące mnie dane z tego XML-a i dalej je wykorzystać, czy to wrzucić na jakiegoś grida czy do bazy, to już jest sprawa drugorzędna.

Poszukaj jakiejś biblioteki do XML(RapidXML,FastXML,etc. jest tego sporo) i wyciągnij z pliku to co cię interesuje.

AnyKtokolwiek napisał(a):

C++ jako język pozbawiony refleksji nadaje się bardzo słabo do tego celu

Co ma refleksja do parsowania XML?

0

A masz jakieś doświadczenie z tymi parserami? Możesz coś podpowiedzieć np. RapidXML, jak to się instaluje/"dorzuca" do C++ Buildera?

Tak może żeby pokazać co muszę "obrobić" to posłużę się konkretnym przykładem:
Jak napisałem powyżej odpytuję API na portalu OpenWeatherMap i pytam o londyn. W odpowiedzi dostaję XML-a w postaci:

<?xml version="1.0" encoding="UTF-8"?>
<current>
	<city id="2643743" name="London">
		<coord lon="-0.13" lat="51.51"/>
		<country>GB</country>
		<timezone>0</timezone>
		<sun rise="2020-03-19T06:04:43" set="2020-03-19T18:11:39"/>
	</city>
	<temperature value="279.44" min="278.15" max="281.48" unit="kelvin"/>
	<feels_like value="275.31" unit="kelvin"/>
	<humidity value="87" unit="%"/>
	<pressure value="1026" unit="hPa"/>
	<wind>
		<speed value="4.1" unit="m/s" name="Gentle Breeze"/>
		<gusts/>
		<direction value="60" code="ENE" name="East-northeast"/>
	</wind>
	<clouds value="90" name="overcast clouds"/>
	<visibility value="6000"/>
	<precipitation mode="no"/>
	<weather number="804" value="overcast clouds" icon="04d"/>
	<lastupdate value="2020-03-19T07:35:29"/>
</current>

No i teraz chcę wyciągnąć interesujące mnie informacje np. kraj, miasto, temperatura i wilgotność (myślę że tyle wystarczy).
Dłubałem wczoraj cały wieczór ale bez rezultatów.

0
forritarik napisał(a):

A masz jakieś doświadczenie z tymi parserami? Możesz coś podpowiedzieć np. RapidXML, jak to się instaluje/"dorzuca" do C++ Buildera?

Używam Qt, więc korzystam z ichniejszych parserów XML.
Patrząc na przykładowy kod użycie RapidXML wygląda na dość proste i przyjemne.
A z tego co piszą na stronie, to "instalacja" ogranicza się do dodania include.

If you are looking for a stable and fast parser, look no further. Integration with your project will be trivial, because entire library is contained in a single header file, and requires no building or configuration.

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