【Android開発】HttpClientとHttpGetでサーバーとjson通信する

Androidとサーバーとのやり取りをプログラムしているときのメモ。

まずハマったのがHttpClientで通信しようとしても、「unknown host」とエラーとなる。初めはDNSとかAndroidエミュレータの名前解決に問題がありそうだと調べたけど違った。

Androidのマニフェストに

<uses-permission android:name="android.permission.INTERNET" />

を記述しないと、プログラムからインターネットに接続できないらしい。

参考になったのが下記サイト。

初めてのAndroid -第7章 世界との接続-

さらにサーバーのレスポンスの処理とかは下記サイトを参考に。

[android] androidでBingでJSONで

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 追記>

タイムアウトの処理を追記

 

<関連記事>

jQueryを使ってPHPとJSON形式のデータをやり取りする方法
【VB.NET】アプリケーションからJSON形式でサーバと通信する
【PHP】json_decode, json_encodeを使えるようにjsonをインストール