[[oktatas:programozás:java:java_rest_api_kliens|< Java REST API kliens]] ====== Java REST API kliens ====== * **Szerző:** Sallai András * Copyright (c) 2022, Sallai András * Szerkesztve: 2022, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== REST API kliens megvalósítására a Java nyelvben HTTP kapcsolatra képes osztályra van szükségünk. Az 1.1 JDK-tól rendelkezésre áll a **java.net.HttpURLConnection**. A 11-s Java verziótól elérhető a **java.net.http.HttpClient**. Utóbbi használata rövidebb kódot eredményez. * java.net.HttpURLConnection - Java 1-től * java.net.http.HttpClient - Java 11-től Ebben a leírásban a **HttpURLconnection** osztályt használjuk. Előre elkészített REST API klienst találunk a következő helyen: * https://github.com/oktat/saclient REST API általában JSON formátumban szolgálja ki az adatokat. Ehhez külső programozói könyvtárakat szoktunk használni. Ilyenek: * JSON.simple * Gson Itt mindkettőre látunk példát. ===== JSON.simple ===== ==== Olvasás ==== A következő példában egy online elérhető helyettesítő REST API-t fogunk használni: * https://jsonplaceholder.typicode.com/users/ Szeretnénk lekérdezni a felhasználók adatait és kiíratni a nevüket. import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Iterator; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; public class App { public static void main(String[] args) throws Exception { System.out.println("REST API olvasás"); URL url = new URL("https://jsonplaceholder.typicode.com/users/"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); int responseCode = conn.getResponseCode(); if (responseCode != 200) { throw new RuntimeException("Http válasz: " + responseCode); }else { Object obj; JSONArray ja; try { JSONParser parser=new JSONParser(); obj = parser.parse(new InputStreamReader(conn.getInputStream())); ja = (JSONArray) obj; } catch ( ParseException ex) { throw new IOException("JSON parser error, " + ex.getMessage(),ex); } Iterator itr = ja.iterator(); while(itr.hasNext()) { JSONObject obj2 = (JSONObject) itr.next(); System.out.println( obj2.get("name") ); System.out.println( ((JSONObject) obj2.get("address")).get("city") ); } } } } ==== Olvasás 2 ==== Nézzük meg egy localhost:8000 található REST API lekérdezése, ami dolgozók adatait szolgáltatja. Ha a REST API egy hai-server előfordulhat, hogy IPv6-s címmel érhető el: [::1] import java.net.HttpURLConnection; import java.net.URL; import java.util.Iterator; import java.util.Scanner; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class App { public static void main(String[] args) throws Exception { System.out.println("JSON olvasás"); URL url = new URL("http://localhost:8000/api/employees"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); int responsecode = conn.getResponseCode(); if(responsecode != 200) { throw new RuntimeException("HttpResponseCode: " + responsecode); }else { Scanner sc = new Scanner(url.openStream(), "UTF-8"); String inline = ""; while(sc.hasNext()) { inline += sc.nextLine(); } JSONParser parse = new JSONParser(); Object obj = parse.parse(inline); JSONArray ja = (JSONArray) obj; Iterator itr = ja.iterator(); while(itr.hasNext()) { JSONObject obj2 = (JSONObject) itr.next(); System.out.println( obj2.get("name") ); } } } } ===== Gson ===== A Gson egy Java programozói könyvtár, amely lehetővé teszi Java objektumok JSON szöveggé alakítását és vissza. A Gson letöltése: * https://github.com/google/gson (2022) ==== Példa ==== 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.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 App { public static void main(String[] args) throws Exception { System.out.println("REST API lekérés"); URL url = new URL("http://localhost:3000/employees"); 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); } GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); Gson gson = builder.create(); Employee[] employeeArray = gson.fromJson(text, Employee[].class); ArrayList list = new ArrayList<>(Arrays.asList(employeeArray)); for(Employee employee: list) { System.out.println(employee.name); } } } ===== Függelék ===== ==== json könyvtárak ==== * https://github.com/fangyidong/json-simple * http://code.google.com/p/json-simple/ * http://www.java2s.com/Code/Jar/j/Downloadjsonsimple11jar.htm * https://mvnrepository.com/artifact/org.json/json * https://github.com/stleary/JSON-java * https://dzone.com/articles/how-to-parse-json-data-from-a-rest-api-using-simpl (2022)