Komunikacja za pomocą JSON z serwerem PHP w Javie
Jakiś czas temu pisałem pewną aplikację w Javie, która wykorzystywała format JSON do komunikacji z serwerem i wywoływania na nim pewnych procedur. Można rzec, że była to bardzo uboga wersja JSON-RPC czyli oficjalnego protokołu wywoływania procedur na zdalnej maszynie.
JSON, podobnie jak w XML, jest formatem przesyłu danych w postaci tekstu (czyli postaci odpowiedniej dla człowieka), ale w przeciwieństwie do niego jest lżejszy, co widać chociażby po tym, że sam jest opisywany za pomocą tylko kilku znaków. Pomimo tego, że format ten pochodzi z języka Java Script, istnieje masa bibliotek, które umożliwiają jego wykorzystanie w wielu językach, w tym właśnie w języku Java.
W przypadku aplikacji, którą pisałem, jednym z jej zadań było łączenie się z serwerem napisanym PHP i wywoływaniem odpowiednich procedur, które udostępniały jakieś dane. Format procedur był następujący:
“sessid”: “id” ”action”: “akcja” ”data”: “dane” |
Przy czym dane również były zapisane w formacie JSON, ale były zorganizowane w odpowiednie struktury, które rozpoznawał serwer. Biblioteką, którą użyłem do wysyłania i odbierania danych była org.json, czyli pierwsza z dostępnych dla języka JAVA. W przypadku mojego kodu jej użycie ograniczyło się do użyciu tylko dwóch klas – JSONObject oraz JSONArray, z których za pomocą metody toString(), można wyciągnąć całą zapisaną hierarchię i następnie wysłać ją za pomocą odpowiedniego strumienia połączonego z serwerem.
Teraz przedstawię trochę kodu pokazującego w jaki sposób połączyć się z serwerem za pomocą HttpURLConnection oraz jak wykorzystać to połączenie do przesłania danych w formacie JSON. Na początek kod wysyłający zapytanie i odbierający odpowiedź serwera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.io.*; // BufferedReader, BufferedWriter, IOException, InputStreamReader, OutputStreamWriter import.java.net.*; // HttpURLConnection, URL /* ... */ URL url = new URL(“http://mysweet.phpserver.com/”); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setDoOutput(true); // Bo chcemy wysyłać conn.setRequestMethod(“POST”); // np. jako zapytanie POST // Request BufferedWriter out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); out.write(“Some post data/query”); out.close(); // Response BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine, answer = “”; while((inputLine = in.readLine()) != null) { answer += inputLine; } in.close(); conn.disconnect(); |
Jak widać nie ma tutaj zbyt dużo roboty, więcej zapewne dzieje się wewnątrz tych klas, ale przecież po to one są żeby się tym z grubsza nie przejmować. Kolejny kod przedstawia sposób tworzenia zapytań za pomocą wspomnianej biblioteki org.json:
1 2 3 4 5 6 7 8 9 10 11 12 | import org.json.*; //JSONArray, JSONException, JSONObject /* ... */ JSONObject root = new JSONObject() .put(“sesid”, sesid) .put(“action”, action) .put(“data”, data); // data może być liczbą, stringiem lub obiektem JSONObject string query = “json=” + root.toString(); |
Ostatecznie obiekt query zostanie przekazany jako zapytanie do wcześniej wspomnianego obiektu klasy BufferedWriter, dzięki któremu poleci do serwera. Odbieranie odpowiedzi jest równie proste:
1 2 3 4 5 6 7 8 9 10 11 | string answer; /* Odbieranie odpowiedzi ... */ JSONObject object = new JSONObject(answer); int status = object.getInt(“status”); string text = object.getString(“some_text”); JSONObject node = object.getJSONObject(“some_struct”); JSONArray array = object.getJSONArray(“some_array”); |
I generalnie tak to wygląda, nie trzeba nic samemu parsować, ponieważ wszystko zapewnia kilka gotowych już klas – największa zaleta obiektowych języków programowania.