Ako spracovať JSON/XML string v SAP Cloud Applications Studiu? – 2. časť


Napísali: Kristián Kačinetz, SAP Developer & Ondrej Rimovský, SAP Developer

V predchádzajúcej časti série článkov sme si ukázali akým spôsobom je v Jave možné implementovať jednoduchú SOAP službu. Cieľom tejto časti série bude rozšírenie našej jednoduchej SOAP služby o volania na REST službu a teda získanie dát z REST služby a ich následné spracovanie do SOAP služby. V tejto časti zároveň ukončíme implementáciu, ktorú je potrebné vykonať v Jave.

V tejto časti série článkov budeme využívať kód vytvorený v predchádzajúcej časti, ktorý je možné stiahnuť v predchádzajúcej časti série. Kód vytvorený v predchádzajúcej časti rozšírime o triedy a metódy implementujúce volania na REST službu a spracovanie získaných dát. Pre ilustráciu sme sa rozhodli využiť voľne dostupnú REST službu, ktorá získava dáta o vývoji ochorenia Covid-19 vo svete. Dokumentácia tejto služby je dostupná na odkaze:

Na stiahnutie soap guide

Implementácia

V package types si vytvoríme dve nové triedy, jednu na popísanie štruktúry dát, ktoré chceme poslať na výstupe a druhú na uchovanie týchto dát v liste. Naše triedy nazveme CountryData a CountryDataList. Implementáciu týchto tried znázorňujú ukážky nižšie:

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;
    }
}

V priečinku Java si vytvoríme nový package a nazveme ho utils. V tomto package si vytvoríme dve nové Java triedy s názvom ApiCalls a DataParser. Trieda ApiCalls bude obsahovať implementáciu metódy na získavanie odpovedí z využívaných služieb. Obsah metódy ApiCalls je uvedený v ukážke kódu nižšie:

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;
    }
}

Pred ďalším krokom je v koreňovom adresári potrebné editovať súbor pom.xml a do závislostí pridať nasledujúcu závislosť:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.4</version>
</dependency>

V metóde DataParser implementujeme logiku spracovania údajov, ktoré sme obdržali pri volaní REST služby. Obsah metódy DataParser je ilustrovaný nasledujúcou ukážkou 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 triedu GuideService, do ktorej pridáme nasledujúcu metódu:

@WebMethod(operationName = "getCountryDataList")
public CountryDataList getCountryDataList() {
    CountryDataList countryDataList = new CountryDataList();
    countryDataList.setCountryDataList(DataParser.getCountryDataList());
    return countryDataList;
}

Na záver je potrebné opätovne vygenerovať war súbor za pomoci príkazu „mvn package“, podrobný postup bol popísaný v predchádzajúcej časti. Taktiež je projekt potrebný opätovne nahrať na SAP Cloud Platform pričom odporúčame aplikáciu nahrať s novým menom.

Výsledkom tejto časti blogu je SOAP služba, ktorá načíta a spracuje údaje z REST služby a poskytne výstup v SOAP formáte.

Pokračovanie nabudúce…

V nasledujúcej časti série článkov si ukážeme ako je možné využiť našu SOAP službu pri zakladaní objektov v SAP Cloud for Customer za pomoci Application Studia.