【Android開発】HttpClientとHttpGetでサーバーとjson通信する
Androidとサーバーとのやり取りをプログラムしているときのメモ。
まずハマったのがHttpClientで通信しようとしても、「unknown host」とエラーとなる。初めはDNSとかAndroidエミュレータの名前解決に問題がありそうだと調べたけど違った。
Androidのマニフェストに
<uses-permission android:name="android.permission.INTERNET" />
を記述しないと、プログラムからインターネットに接続できないらしい。
参考になったのが下記サイト。
さらにサーバーのレスポンスの処理とかは下記サイトを参考に。
GETでJSON文字列を取得するメソッドは次のような感じ。
/** * 指定URLからgetした文字列を取得する * @param sUrl * @return */ public String getData(String sUrl) { HttpClient objHttp = new DefaultHttpClient(); HttpParams params = objHttp.getParams(); HttpConnectionParams.setConnectionTimeout(params, 1000); //接続のタイムアウト HttpConnectionParams.setSoTimeout(params, 1000); //データ取得のタイムアウト String sReturn = ""; try { HttpGet objGet = new HttpGet(sUrl); HttpResponse objResponse = objHttp.execute(objGet); if (objResponse.getStatusLine().getStatusCode() < 400){ InputStream objStream = objResponse.getEntity().getContent(); InputStreamReader objReader = new InputStreamReader(objStream); BufferedReader objBuf = new BufferedReader(objReader); StringBuilder objJson = new StringBuilder(); String sLine; while((sLine = objBuf.readLine()) != null){ objJson.append(sLine); } sReturn = objJson.toString(); objStream.close(); } } catch (IOException e) { return null; } return sReturn; }
POSTの場合は下記。
/** * 指定URLからpostした文字列を取得する * @param sUrl 送信先URL * @param sJson 文字列に変換したJSONデータ * @return */ public String postJsonData(String sUrl, String sJson) { HttpClient objHttp = new DefaultHttpClient(); String sReturn = ""; try { HttpPost objPost = new HttpPost(sUrl); List<NameValuePair> objValuePairs = new ArrayList<NameValuePair>(2); objValuePairs.add(new BasicNameValuePair("json", sJson)); objPost.setEntity(new UrlEncodedFormEntity(objValuePairs, "UTF-8")); HttpResponse objResponse = objHttp.execute(objPost); if (objResponse.getStatusLine().getStatusCode() < 400){ InputStream objStream = objResponse.getEntity().getContent(); InputStreamReader objReader = new InputStreamReader(objStream); BufferedReader objBuf = new BufferedReader(objReader); StringBuilder objJson = new StringBuilder(); String sLine; while((sLine = objBuf.readLine()) != null){ objJson.append(sLine); } sReturn = objJson.toString(); objStream.close(); } } catch (IOException e) { return null; } return sReturn; }
サーバー側の処理は前の記事を参考に。
<2010/03/18 追記>
タイムアウトの処理を追記
<関連記事>