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.