tarotaroのエンジニア生活

技術ネタとか日々の仕事の話とか

JSONを得るプログラム for Android

Webサービスを提供する企業などでは、Webサービスのアプリ化を行うところが増えているというよりも、必須になってきているように思える、そういうわけで、今回は、Webサービスをアプリ化する際に使われるJSONを得るまでのプログラムについて書こうと思う。まず、準備として、実際にJSON を使う前に、JSONのデータをどのようにして受け取るかについて書きたいと思う。どのようにしてデータを受け取るかといわれれば、ほぼ、http通信を使って行うというのが定石でまず、http通信でのデータの受け取りかたについて書きたいと思う。
http通信については、postとgetの2通りの通信方法があるのは、多分だいたいの人は知っていると思う。まず、GETは、次のように書く

public HttpResponse GET(String url) throws ClientProtocolException,

            IOException {

        HttpGet req = new HttpGet(url);

        DefaultHttpClient http = createHttpClient();

        return http.execute(req);

    }

次にPOSTは次のように書く

 public HttpResponse POST(String url, HashMap<String, String> params) 
       throws ClientProtocolException, IOException {

 

        String urlStr = buildUrl(url);

        HttpPost req = new HttpPost(urlStr);

        List<NameValuePair> content = new ArrayList<NameValuePair>(1);

        for (Map.Entry<String, String> entry : params.entrySet()) {

            content.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

        }

        req.setEntity(new UrlEncodedFormEntity(content));

        DefaultHttpClient http = createHttpClient();

        return http.execute(req);

    }




GETについては、あまり説明はいらないと思うが、一応書くとurlにWebサービス側で作ったWebAPIのurlを渡せばいい。もちろん、バイナリデータなどは、urlencodeされてないとまずい。POSTのほうは、HashMapで表現されたパラメータとその値を引数を渡して、そこからPOSTで使われる内部のデータにurlエンコードして渡している。ちなみに、Basic認証を追加して他からアクセスできないようにしたい等の要望もあると思うがそのときは、httpclientにたいして次のようにすればいい

http.getCredentialsProvider().setCredentials(

                new AuthScope(hostnmame, port),

                new UsernamePasswordCredentials(username, password));


ここで、使われているhttp関係のメソッドはAndroid SDKに付属しているorg.apacheあたりをimportして使えるようになる。ここから、JSONのデータを得るためには、次のようにする


public JSONObject getJSON(String url) throws ClientProtocolException,

            IOException, JSONException {

        HttpResponse res = GET(url);

        HttpEntity entity = res.getEntity();

        InputStream in = entity.getContent();

        String json = readStream(in);

        return new JSONObject(json);

    }

最後に、もちろん、これは、webアクセスをしていて、データが得られるまでは時間がいるのでメインスレッドに書くとプログラムが止まってしまうので、Threadを作ってやって非同期にデータを持ってこないといけないのは、言うまでもないと思う。