[[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)