DataAPIはAndroidで記事を投稿したい!というときにとても重要なAPIです。
今回は、その中からカテゴリの指定についてざっくり説明したいと思います。
※本記事は、ライフサイクルやAPIなど理解しているAndroid開発中級者以上を対象としています。
記事のカテゴリを取得する
String cgi_url = "http://path/to/mt-data-api.cgi;
String blog_id = "id";
String username = "username"
String password = "password"
String token;
ArrayList<String> categoryLabel;
ArrayList<Integer> categoryId;
AsyncHttpClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
categoryLabel = new ArrayList<String>();
categoryId = new ArrayList<Integer>();
client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("username", username);
params.put("password", password);
params.put("clientId", "test");
String url = cgi_url.concat("/v2/authentication");
client.post(url, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject res) {
try {
token = res.getString("accessToken");
Toast.makeText(act, "ログインしました", Toast.LENGTH_LONG).show();
preferencesUtil.putInt("InitState", 1);
} catch (Exception e) {
Toast.makeText(act, "ログインエラー", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Throwable e, JSONObject res) {
Toast.makeText(act, "ログインエラー", Toast.LENGTH_LONG).show();
}
});
url = cgi_url.concat("/v2/sites/2/categories");
client.get(url, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject json) {
try {
// タイトルを取得する場合
JSONArray datas = json.getJSONArray("items");
for(int i=0; i<datas.length(); i++) {
categoryLabel.add(datas.getJSONObject(i).getString("label"));
categoryId.add(Integer.parseInt(datas.getJSONObject(i).getString("id")));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable e, JSONObject res) {
Toast.makeText(act, "ログインエラー", Toast.LENGTH_LONG).show();
}
});
}
メンバ領域に、cgi_url:DataAPIのエンドポイント、blog_id:ブログID、username :ユーザー名、password:パスワードを宣言します。
記事の取得は、onCreate内でやります。
ログインするために、メンバ変数のusernameとpasswordをRequestParamsに挿入しAsyncHttpClientでcgi_url+/v2/authenticationにpostします。
ログインに成功すると、onSuccessに入りJSONObjectが返却されるのでaccessTokenを保存しておきます。
記事のカテゴリを取得するのは、先ほど作成したRequestParamsをAsyncHttpClientでcgi_url+/v2/sites/2/categoriesにpostします。
カテゴリの取得に成功すると、onSuccessに入るのでJSONArrayにitemsの要素を挿入します。
JSONArray datas = json.getJSONArray("items");
取得してきたitemsから登録されているカテゴリのlabelとidを取得します。
for(int i=0; i<datas.length(); i++) {
categoryLabel.add(datas.getJSONObject(i).getString("label"));
categoryId.add(Integer.parseInt(datas.getJSONObject(i).getString("id")));
}
これで、記事のカテゴリを取得できます。
記事を投稿する
ここまで出来れば、あとは投稿するだけです。
private void uploadText() throws JSONException {
CharSequence title = "title";
CharSequence body = "body";
JSONObject entry = new JSONObject();
RequestParams params = new RequestParams();
JSONArray categories = new JSONArray();
JSONObject category;
for(int i=0; i<categoryLabel.size(); i++) {
category = new JSONObject();
category.put("id",categoryId.get(i));
categories.put(category);
}
try {
entry.put("title", title);
entry.put("body", body);
entry.put("categories",categories);
entry.put("status", "Draft");
} catch (JSONException e) {
e.printStackTrace();
}
params.put("entry", entry.toString());
String url = cgi_url.concat("/v2/sites/").concat(blog_id).concat("/entries");
Header[] headers = new Header[1];
headers[0] = new BasicHeader("X-MT-Authorization", "MTAuth accessToken=".concat(token));
client.post(getBaseContext(), url, headers, params, "application/x-www-form-urlencoded", new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject res) {
Toast.makeText(act, "送信完了", Toast.LENGTH_LONG).show();
}
public void onFailure(Throwable e, JSONObject res) {
Toast.makeText(act, "送信エラー", Toast.LENGTH_LONG).show();
}
});
}
まず、エントリとなる要素のJSONObjectと記事リクエストを送信するためのRequestParamsを作成します。
あとは、複数のカテゴリを挿入するためのJSONArrayと個々のカテゴリを挿入するJSONObjectを用意します。
カテゴリのエントリはidで、カテゴリ群のエントリはcategoriesになります。
postする時は、categories内にcategoryを挿入する形で送信します。
あとは、AsyncHttpClientでurlのエンドポイントとparamsと設定したheadersを入れて送信すればカテゴリが登録された記事が出来ます。
補足
インターネットを使用するので、AndroidManifest内に
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
を宣言する事はお忘れなく!