{"id":848,"date":"2011-03-13T17:05:48","date_gmt":"2011-03-13T16:05:48","guid":{"rendered":"http:\/\/netrix.org.pl\/?p=848"},"modified":"2011-03-13T17:15:00","modified_gmt":"2011-03-13T16:15:00","slug":"komunikacja-za-pomoca-json-z-serwerem-php-w-javie","status":"publish","type":"post","link":"https:\/\/netrix.org.pl\/index.php\/2011\/03\/13\/komunikacja-za-pomoca-json-z-serwerem-php-w-javie\/","title":{"rendered":"Komunikacja za pomoc\u0105 JSON z serwerem PHP w Javie"},"content":{"rendered":"<p>Jaki\u015b czas temu pisa\u0142em pewn\u0105 aplikacj\u0119 w Javie, kt\u00f3ra wykorzystywa\u0142a format JSON do komunikacji z serwerem i wywo\u0142ywania na nim pewnych procedur. Mo\u017cna rzec, \u017ce by\u0142a to bardzo uboga wersja <a href=\"http:\/\/json-rpc.org\/\">JSON-RPC<\/a> czyli oficjalnego protoko\u0142u wywo\u0142ywania procedur na zdalnej maszynie. <\/p>\n<p><a href=\"http:\/\/www.json.org\/\">JSON<\/a>, podobnie jak w <a href=\"http:\/\/pl.wikipedia.org\/wiki\/XML\">XML<\/a>, jest formatem przesy\u0142u danych w postaci tekstu (czyli postaci odpowiedniej dla cz\u0142owieka), ale w przeciwie\u0144stwie do niego jest l\u017cejszy, co wida\u0107 chocia\u017cby po tym, \u017ce sam jest opisywany za pomoc\u0105 tylko kilku znak\u00f3w. Pomimo tego, \u017ce format ten pochodzi z j\u0119zyka Java Script, istnieje masa bibliotek, kt\u00f3re umo\u017cliwiaj\u0105 jego wykorzystanie w wielu j\u0119zykach, w tym w\u0142a\u015bnie w j\u0119zyku Java.<\/p>\n<p>W przypadku aplikacji, kt\u00f3r\u0105 pisa\u0142em, jednym z jej zada\u0144 by\u0142o \u0142\u0105czenie si\u0119 z serwerem napisanym PHP i wywo\u0142ywaniem odpowiednich procedur, kt\u00f3re udost\u0119pnia\u0142y jakie\u015b dane. Format procedur by\u0142 nast\u0119puj\u0105cy:<\/p>\n<pre lang=\"text\">\r\n\u201csessid\u201d: \u201cid\u201d\r\n\u201daction\u201d: \u201cakcja\u201d\r\n\u201ddata\u201d: \u201cdane\u201d\r\n<\/pre>\n<p>Przy czym dane r\u00f3wnie\u017c by\u0142y zapisane w formacie JSON, ale by\u0142y zorganizowane w odpowiednie struktury, kt\u00f3re rozpoznawa\u0142 serwer. Bibliotek\u0105, kt\u00f3r\u0105 u\u017cy\u0142em do wysy\u0142ania i odbierania danych by\u0142a <a href=\"http:\/\/www.json.org\/java\/index.html\">org.json<\/a>, czyli pierwsza z dost\u0119pnych dla j\u0119zyka JAVA. W przypadku mojego kodu jej u\u017cycie ograniczy\u0142o si\u0119 do u\u017cyciu tylko dw\u00f3ch klas \u2013 <em>JSONObject<\/em> oraz <em>JSONArray<\/em>, z kt\u00f3rych za pomoc\u0105 metody <em>toString()<\/em>, mo\u017cna wyci\u0105gn\u0105\u0107 ca\u0142\u0105 zapisan\u0105 hierarchi\u0119 i nast\u0119pnie wys\u0142a\u0107 j\u0105 za pomoc\u0105 odpowiedniego strumienia po\u0142\u0105czonego z serwerem.<\/p>\n<p>Teraz przedstawi\u0119 troch\u0119 kodu pokazuj\u0105cego w jaki spos\u00f3b po\u0142\u0105czy\u0107 si\u0119 z serwerem za pomoc\u0105 <em>HttpURLConnection<\/em> oraz jak wykorzysta\u0107 to po\u0142\u0105czenie do przes\u0142ania danych w formacie JSON. Na pocz\u0105tek kod wysy\u0142aj\u0105cy zapytanie i odbieraj\u0105cy odpowied\u017a serwera:<\/p>\n<pre lang=\"java\" line=\"1\">\r\nimport java.io.*;\t\t\/\/ BufferedReader, BufferedWriter, IOException, InputStreamReader, OutputStreamWriter\r\nimport.java.net.*;\t\t\/\/ HttpURLConnection, URL\r\n\r\n\/*\r\n...\r\n*\/\r\n\r\nURL url = new URL(\u201chttp:\/\/mysweet.phpserver.com\/\u201d);\r\nHttpURLConnection conn = (HttpURLConnection)url.openConnection();\r\n\r\nconn.setDoOutput(true);\t\t\t\/\/ Bo chcemy wysy\u0142a\u0107\r\nconn.setRequestMethod(\u201cPOST\u201d);\t\t\/\/ np. jako zapytanie POST\r\n\r\n\/\/ Request\r\nBufferedWriter out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));\r\nout.write(\u201cSome post data\/query\u201d);\r\nout.close();\r\n\r\n\/\/ Response\r\nBufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));\r\n\r\nString inputLine, answer = \u201c\u201d;\r\nwhile((inputLine = in.readLine()) != null)\r\n{\r\n    answer += inputLine;\r\n}\r\n\r\nin.close();\r\nconn.disconnect();\r\n<\/pre>\n<p>Jak wida\u0107 nie ma tutaj zbyt du\u017co roboty, wi\u0119cej zapewne dzieje si\u0119 wewn\u0105trz tych klas, ale przecie\u017c po to one s\u0105 \u017ceby si\u0119 tym z grubsza nie przejmowa\u0107. Kolejny kod przedstawia spos\u00f3b tworzenia zapyta\u0144 za pomoc\u0105 wspomnianej biblioteki <strong>org.json<\/strong>:<\/p>\n<pre lang=\"java\" line=\"1\">\r\nimport org.json.*;\t\/\/JSONArray, JSONException, JSONObject\r\n\r\n\/*\r\n...\r\n*\/\r\n\r\nJSONObject root = new JSONObject()\r\n    .put(\u201csesid\u201d, sesid)\r\n    .put(\u201caction\u201d, action)\r\n    .put(\u201cdata\u201d, data);\t\t\t \/\/ data mo\u017ce by\u0107 liczb\u0105, stringiem lub obiektem JSONObject\r\n\r\nstring query = \u201cjson=\u201d + root.toString();\r\n<\/pre>\n<p>Ostatecznie obiekt <em>query<\/em> zostanie przekazany jako zapytanie do wcze\u015bniej wspomnianego obiektu klasy <em>BufferedWriter<\/em>, dzi\u0119ki kt\u00f3remu poleci do serwera. Odbieranie odpowiedzi jest r\u00f3wnie proste:<\/p>\n<pre lang=\"java\" line=\"1\">\r\nstring answer;\r\n\r\n\/* Odbieranie odpowiedzi\r\n...\r\n*\/\r\n\r\nJSONObject object = new JSONObject(answer);\r\nint status = object.getInt(\u201cstatus\u201d);\r\nstring text = object.getString(\u201csome_text\u201d);\r\nJSONObject node = object.getJSONObject(\u201csome_struct\u201d);\r\nJSONArray array = object.getJSONArray(\u201csome_array\u201d);\r\n<\/pre>\n<p>I generalnie tak to wygl\u0105da, nie trzeba nic samemu parsowa\u0107, poniewa\u017c wszystko zapewnia kilka gotowych ju\u017c klas \u2013 najwi\u0119ksza zaleta obiektowych j\u0119zyk\u00f3w programowania.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jaki\u015b czas temu pisa\u0142em pewn\u0105 aplikacj\u0119 w Javie, kt\u00f3ra wykorzystywa\u0142a format JSON do komunikacji z serwerem i wywo\u0142ywania na nim pewnych procedur. Mo\u017cna rzec, \u017ce by\u0142a to bardzo uboga wersja JSON-RPC czyli oficjalnego protoko\u0142u wywo\u0142ywania procedur na zdalnej maszynie. JSON, podobnie jak w XML, jest formatem przesy\u0142u danych w postaci tekstu (czyli postaci odpowiedniej dla [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[148,147,182,146],"_links":{"self":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/848"}],"collection":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/comments?post=848"}],"version-history":[{"count":6,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/848\/revisions"}],"predecessor-version":[{"id":853,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/848\/revisions\/853"}],"wp:attachment":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/media?parent=848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/categories?post=848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/tags?post=848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}