【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 追記>
タイムアウトの処理を追記
<関連記事>