[[oktatas:programozás:java:java_rest_api_kliens|< Java REST API kliens]] ====== Java REST API Gson használat ====== * **Szerző:** Sallai András * Copyright (c) 2022, Sallai András * Szerkesztve: 2022, 2023, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== Ebben a példában **Gson** könyvtárat a és a Java **HttpURLConnection** osztályát használjuk a REST API elérésére. A Gson beszerzése: * https://github.com/google/gson (2022) ===== A működésről ===== ==== Sorosítás ==== A sorosítás vagy angolul serialization, amikor egy Java objektumot JSON formátumra alakítunk. Lépések: * A toJson() metódssal átadjuk az objektumot * Formázás, ha szükséges Gson gson = new Gson(); MyObject obj = new MyObject("Alice", 25); // Az obj-t JSON formátumra alakítja String json = gson.toJson(obj); ==== Objektumok és JSON konverzió ==== A deszerializáció vagy angolul deserialization, amikor JSON formátumot egy Java objektumra alakítunk. Lépések: * A fromJson() metódssal átadjuk az objektumot String jsonInput = "{\"name\":\"Bob\",\"age\":30}"; // JSON-ból objektumot hoz létre MyObject newObj = gson.fromJson(jsonInput, MyObject.class); ==== Gson funkciók ==== * Listák és szótárak kezelése generikus típusokkal. * Lehetőség az konverzió testreszabására. * A JsonSerializer és a JsonDeserializer implementálásával. * @Expose - kiiktat egy mezőt a sorosításból * A transient kulcsszóval ellátott mezők nem kerülnek sorosításra. * Képes kezelni nem alaptípusokat is: * Például dátumok, időpontok public class MyObject { private String name; // Ez a mező nem kerül sorosításra: private transient int age; } import com.google.gson.annotations.Expose; public class MyObject { @Expose private String name; // Ez a mező nem kerül sorosításra: @Expose(serialize = false) private int age; } ===== JSON tartalom ===== Legyen egy JSON tartalom, amit valamilyen REST API-val kiszolgálunk. Lehet például Node.js csomag: json-server vagy hai-server. { "employees": [ { "id": 1, "name": "Nagy János", "city": "Szolnok", "salary": 8400000 }, { "id": 2, "name": "Páros Lajos", "city": "Szeged", "salary": 3430000 }, { "id": 3, "name": "Aranyos Enikő", "city": "Szolnok", "salary": 4245000 } ] } ===== Dolgozók lekérése ===== public class Employee { String name; String city; double salary; public Employee() {} public Employee(String name, String city, double salary) { this.name = name; this.city = city; this.salary = salary; } } import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class HttpClient { public String getData(String urlStr) { String text = null; try { text = tryGetData(urlStr); } catch (IOException e) { System.err.println("Hiba! A lekérés sikertelen!"); System.err.println(e.getMessage()); } return text; } public String tryGetData(String urlStr) throws IOException { URL url = new URL(urlStr); HttpURLConnection http = (HttpURLConnection) url.openConnection(); http.setRequestMethod("GET"); http.connect(); String text = null; int responseCode = http.getResponseCode(); if (responseCode != 200) { throw new RuntimeException("Http válasz: " + responseCode); }else { text = new String( http.getInputStream().readAllBytes(), StandardCharsets.UTF_8); } return text; } public ArrayList getEmployees() { String urlStr = "http://[::1]:8000/employees"; String text = this.getData(urlStr); GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); Gson gson = builder.create(); Employee[] employeeArray = gson.fromJson(text, Employee[].class); ArrayList list = new ArrayList<>(Arrays.asList(employeeArray)); return list; } } import java.util.ArrayList; public class Client { public void printEmps() { System.out.println("REST API lekérés"); HttpClient http = new HttpClient(); ArrayList list = http.getEmployees(); for(Employee employee: list) { System.out.println(employee.name); } } } public class App { public static void main(String[] args) throws Exception { new Client().printEmps();; } } ===== Token küldése ===== URL url = new URL("http://localhost:8000/api/valami"); String token = "as3klaj334lkdfj"; HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestProperty("Accept", "application/json"); con.setRequestProperty("Authorization","Bearer " + token); con.setRequestProperty("Content-Type","application/json"); con.setRequestMethod("POST"); ===== Példa projekt ===== * https://github.com/oktat/exjclient.git