タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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;
        }
    }
}