今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

AndroidでPOSTメソッドを使ってログイン

AndroidアプリからWebアプリケーションにログインしようと思ってサンプルを探してたら、PostMethodを使えというサンプルを発見。
apacheからhttpcomponents-core-4.1.3-bin.tar.gz に入ってたjarをビルドパスに加えてもPostMethodというクラスを解決できなくてコンパイルエラー。
調べてみると、PostMethodというクラスは、commons-httpclient-3.0.jarに入ってるらしいけど、これって2007年までしか更新されてない。ということは既にメンテナンスされてないっぽい。
じゃあ、代わりがあるんじゃね?って思ってぐぐってたら、どうやらHttpPostクラスに置き換わってるらしい。

というわけで、こんな感じで実装したらログインできた。

    public boolean login(String mailaddress, String password) {
        if (mailaddress == null || password == null) return false;
        String url = "http://localhost:8080/hoge/user/login";
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        List params = new ArrayList();
        params.add("mailaddress", mailaddress);
        params.add("password", password);
        try {
            post.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse resp = httpClient.execute(post);
            // ログインできたかどうかを判定
            if (status == HttpStatus.SC_OK && isLoginSucceeded(resp)) {
                return true;
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return false;
    }

    private boolean isLoginSucceeded(HttpResponse resp) throws IOException {
        InputStream is = resp.getEntity().getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        try {
            while (true) {
                String s = reader.readLine();
                if (s == null) break;
                if (s.contains("ログイン")) return false;
            }
        } finally {
            reader.close();
        }
        return true;
    }

isLoginSucceeded()の内部で、HTMLを解析して結果を返すようにした。
ここの例では、HTMLに「ログイン」という文字列が含まれていればログイン失敗とみなすようにした。