Jak zpracovat JSON/XML string v SAP Cloud Applications Studiu? – 2. část
Napsali: Kristián Kačinetz, SAP Developer & Ondrej Rimovský, SAP Developer
V předchozí části série článků jsme si ukázali jakým způsobem je v Javě možné implementovat jednoduchou SOAP službu. Cílem této části série bude rozšíření naší jednoduché SOAP služby o volání na REST službu a tedy získání dat z REST služby a jejich následné zpracování do SOAP služby. V této části zároveň ukončíme implementaci, kterou je nutno provést v Javě.
V této části série článků budeme využívat kód vytvořený v předchozí části, který je možné stáhnout v předchozí části série. Kód vytvořený v předchozí části rozšíříme o třídy a metody provádějí volání na REST službu a zpracování získaných dat. Pro ilustraci jsme se rozhodli využít volně dostupnou REST službu, která získává data o vývoji onemocnění Covid-19 ve světě. Dokumentace této služby je dostupná na odkazu:
Ke stažení soap guide
Implementace
V package types si vytvoříme dvě nové třídy, jednu na popsání struktury dat, které chceme poslat na výstupu a druhou na uchování těchto dat v listu. Naše třídy nazveme CountryData a CountryDataList. Implementaci těchto tříd znázorňují ukázky níže:
package types; import java.util.Calendar; public class CountryData { private String Country; private int Confirmed, Dead, Recovered; private Calendar Updated; public String getCountry() { return Country; } public void setCountry(String country) { Country = country; } public int getConfirmed() { return Confirmed; } public void setConfirmed(int confirmed) { Confirmed = confirmed; } public int getDead() { return Dead; } public void setDead(int dead) { Dead = dead; } public int getRecovered() { return Recovered; } public void setRecovered(int recovered) { Recovered = recovered; } public Calendar getUpdated() { return Updated; } public void setUpdated(Calendar updated) { Updated = updated; } }
package types; import java.util.List; public class CountryDataList { private List CountryDataList; public List getCountryDataList() { return CountryDataList; } public void setCountryDataList(List countryDataList) { CountryDataList = countryDataList; } }
Ve složce Java si vytvoříme nový package a nazveme ho utils. V tomto package si vytvoříme dvě nové Java třídy s názvem ApiCalls a DataParser. Třída ApiCalls bude obsahovat implementaci metody na získávání odpovědí z využívaných služeb. Obsah metody ApiCalls je uveden v ukázce kódu níže:
package utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class ApiCalls { public static String getResponse(URL url, String restMethod) throws IOException { String response = ""; HttpURLConnection con = null; con = (HttpURLConnection) url.openConnection(); con.setRequestMethod(restMethod); int status = con.getResponseCode(); if(status == 200) { BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { response += inputLine; } in.close(); } con.disconnect(); return response; } }
Před dalším krokem je v kořenovém adresáři třeba editovat soubor pom.xml a do závislostí přidat následující závislost:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.4</version> </dependency>
V metodě DataParser implementujeme logiku zpracování údajů, které jsme obdrželi při volání REST služby. Obsah metody DataParser je ilustrován následující ukázkou kódu:
package utils; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import types.CountryData; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.List; public class DataParser { public static List getCountryDataList() { List CountryDataList = new ArrayList<>(); String serviceResponse = callService("https://www.trackcorona.live/api/countries", "GET"); if (serviceResponse != null) { JsonArray JsonRespArr; JsonObject JsonObjectResp; JsonElement JsonElementResp = new JsonParser().parse(serviceResponse); if (JsonElementResp.getAsJsonObject() != null) { JsonObjectResp = JsonElementResp.getAsJsonObject(); if (JsonObjectResp.has("data")) { JsonRespArr = JsonObjectResp.getAsJsonArray("data"); for (JsonElement Item : JsonRespArr ) { CountryDataList.add(getDataForCountry(Item)); } } } } return CountryDataList; } public static CountryData getDataForCountry(JsonElement Item) { CountryData data = new CountryData(); JsonObject DataObj = Item.getAsJsonObject(); data.setCountry(DataObj.get("location").getAsString()); data.setUpdated(GregorianCalendar.from(ZonedDateTime.parse(DataObj.get("updated").getAsString().replace(" ", "T")))); data.setConfirmed(DataObj.get("confirmed").getAsInt()); data.setDead(DataObj.get("dead").getAsInt()); data.setRecovered(DataObj.get("recovered").getAsInt()); return data; } public static String callService(String Url, String restMethod) { URL url = null; try { url = new URL(Url); } catch (MalformedURLException e) { e.printStackTrace(); } String response = null; try { response = ApiCalls.getResponse(url, restMethod); } catch (IOException e) { e.printStackTrace(); } return response; } }
Upravíme třídu GuideService, do které přidáme následující metodu:
@WebMethod(operationName = "getCountryDataList") public CountryDataList getCountryDataList() { CountryDataList countryDataList = new CountryDataList(); countryDataList.setCountryDataList(DataParser.getCountryDataList()); return countryDataList; }
Na závěr je třeba znovu vygenerovat war soubor za pomoci příkazu „mvn package“, podrobný postup byl popsán v předchozí části. Také je projekt potřebný opětovně nahrát na SAP Cloud Platform přičemž doporučujeme aplikaci nahrát s novým jménem.
Výsledkem této části blogu je SOAP služba, která načte a zpracuje údaje z REST služby a poskytne výstup v SOAP formátu.
Pokračování příště…
V následující části série článků si ukážeme jak je možné využít naši SOAP službu při zakládání objektů v SAP Cloud for Customer za pomoci Application Studia.