読者です 読者をやめる 読者になる 読者になる

元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

MovableType DataAPIでアクセストークンを取得する例

AndroidアプリでWebAPIにデータをPOSTして結果を取得するにはの成果を利用して、MovableType Data APIでの記事更新等に必要なアクセストークンを取得した。

その他のWebAPIのPOST操作も同様にしてできるはず。

Authentication: authentication

認証情報を渡してLoader呼び出し。今回はPOSTパラメータをHashMap+putSerializableで渡すことにした。

Bundle bundle = new Bundle();
bundle.putString("url", "https://your-host/your-mt-api.cgi/v1/authentication");

HashMap<String, String> data = new HashMap<String, String>();
data.put("username", "yourname");
data.put("password", "yourpass");
data.put("remember", "0");
data.put("clientId", "DataApiExample");
bundle.putSerializable("data", data);
LoaderManager loaderManager = getLoaderManager();
if (loaderManager != null) {
    loaderManager.restartLoader(0, bundle, this);
}

onCreateLoaderで目的のローダー(HttpAsyncLoader)作成。

@Override
public Loader<String> onCreateLoader(int id, Bundle bundle) {
    HttpAsyncLoader loader = null;
    switch (id) {
        case 0:
            String url = bundle.getString("url");
            HashMap<String, String> data = (HashMap<String, String>)bundle.getSerializable("data");
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            if (data != null) {
                for (Map.Entry<String, String> entry : data.entrySet()) {
                    nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
            }
            loader = new HttpAsyncLoader(this, url, nameValuePairs);
            loader.forceLoad();
            break;
    }
    return loader;
}

読み込みが完了したらJSONを解析してアクセストークンなどを取得。

@Override
public void onLoadFinished(Loader<String> loader, String body) {
    if (body == null) return;
    switch (loader.getId()) {
        case 0:
            ParseSession sessionParser = new ParseSession();
            sessionParser.loadJson(body);
            this.session = sessionParser.getSession();
            // とりあえず表示
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
            alertDialogBuilder.setTitle("Logged in");
            alertDialogBuilder.setMessage(session.accessToken);
            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
            break;
    }
}

JSON解析にはこちらこちらを参考にJacksonを使用します。

単なる構造体として使ってる悪い例ですが、雰囲気を。

public class MTSession {
    public String sessionId;
    public String accessToken;
    public Integer expiresIn;
    public Boolean remember;
}

public class ParseJson {
    protected String content;
    protected JsonNode getJsonNode(String str) {
        try {
            return new ObjectMapper().readTree(str);
        } catch (IOException e) {
            Log.d(getClass().getName(), e.getMessage());
        }
        return null;
    }

    public void loadJson(String str) {

    }

    public String getContent() {
        return this.content;
    }
}

public class ParseSession extends ParseJson {
    private MTSession session = null;
    public MTSession getSession(){ return session; }
    @Override
    public void loadJson(String str) {
        JsonNode root = getJsonNode(str);
        if (root != null) {
            MTSession session = new MTSession();
            session.sessionId = root.path("sessionId").asText();
            session.accessToken = root.path("accessToken").asText();
            session.expiresIn = root.path("expiresIn").asInt();
            session.remember = root.path("remember").asBoolean();
            this.session = session;
        }
    }
}