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