REST API による Salesforce データへのアクセス
学習の目的
この単元を完了すると、次のことができるようになります。
- RestClient クラスを使用して REST 要求をインスタンス化する。
- RestClient クラスおよび RestRequest クラスを使用して非同期 REST 要求を発行する。
- RestResponse クラスを使用して REST 応答を受信し、処理する。
REST API の使用
アプリケーションで Salesforce データにアクセスする準備が整ったら、Salesforce REST API をコールします。一般的に REST API は低レベルであるため、開発者は基本的なネットワークコールを使用して手動でアクセスできますが、その必要はありません。Mobile SDK によって面倒な作業が処理されるためです。
REST API コールを処理するクラスの概要を次に示します。これらのクラスはすべて com.salesforce.androidsdk.rest パッケージに含まれています。
- ClientManager — RestClient インスタンスのファクトリーとして機能します。また、アカウントログインや Salesforce サーバーとのハンドシェイクも処理します。
-
RestClient — REST API 要求を Salesforce サーバーに送信するためのプロトコルを処理します。
RestClient のインスタンスを直接作成しないでください。代わりに、ClientManager.getRestClient() メソッドをコールします。
-
RestRequest — 提供したデータに基づいて書式設定された REST API 要求を表します。また、自身のインスタンスのファクトリーとしても機能します。
- RestResponse — 要求された書式での応答コンテンツを含みます。RestRequest クラスは、RestResponse のインスタンスを作成し、RestClient.AsyncRequestCallback インターフェースの実装を介してアプリケーションに返します。
次に、このフローの動作を示すアニメーションダイアグラムを示します。

- アプリケーションは、RestRequest クラスの静的メソッドをコールし、設定された RestRequest インスタンスを作成します。
- アプリケーションは、新しい RestRequest インスタンスと AsyncRequestCallback インターフェースのインスタンスを RestClient.sendAsync() メソッドに渡します。
- Mobile SDK は、RestRequest オブジェクトで示された REST 要求を Salesforce クラウドサービスに送信します。
- Salesforce は要求を処理し、JSON 応答をアプリケーションに返します。
- Mobile SDK は、新しい RestResponse オブジェクトで JSON 応答をパッケージ化します。
- Mobile SDK は、使用できるように新しい RestResponse オブジェクトをアプリケーションの AsyncRequestCallback 実装に渡します。
まだ起きていますか? 概念的なレベルを越えて、この情報が動作しているところを実際のアプリケーションで見てみましょう。
sendRequest() メソッド
- Android Studio のプロジェクトウィンドウで、 を展開します。
- [MainActivity] をダブルクリックします。
-
onFetchContactsClick メソッドを見つけます。この小さなメソッドは SOQL ステートメントを使用して sendRequest() メソッドをコールします。
public void onFetchContactsClick(View v) throws UnsupportedEncodingException { sendRequest("SELECT Name FROM Contact"); } - 「sendRequest」を右クリックし、 を選択します。sendRequest() は MainActivity クラスの非公開メソッドであることがわかります。このメソッドは後で変更するため、自分のものだったことは幸いでした。
- client — 非公開でクラス範囲の RestClient のインスタンス。このオブジェクトはアプリケーションの初期化中に自動的にインスタンス化されます
- restRequest — 新しい RestRequest インスタンス
- RestRequest.getRequestForQuery() — RestRequest インスタンスを作成する静的な RestRequest ファクトリーメソッド
- AsyncRequestCallback — アプリケーションでの REST 応答コールバックインターフェースの実装
REST 要求の作成
RestRequest restRequest =
RestRequest.getRequestForQuery(
getString(R.string.api_version), soql); REST 要求の送信
client.sendAsync(restRequest, new AsyncRequestCallback()
{
...「async」プレフィックスが何度も出てきています。これは何か重要な意味がありそうですね。要求を非同期で送信するということは、アプリケーションのコードが応答を待つために一時停止しないということです。応答が到着したときには、Mobile SDK はコールバックメソッドのいずれかをコールし、アプリケーションは進行中の処理を一時的に停止して応答を処理します。コードがメイン (UI) スレッドで実行される場合は、非同期で要求を送信する必要があります。
REST 応答の取得と処理
@Override
public void onSuccess(RestRequest request,
final RestResponse result) {
result.consumeQuietly(); // consume before going back to main thread
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
listAdapter.clear();
JSONArray records =
result.asJSONObject().getJSONArray("records");
for (int i = 0; i < records.length(); i++) {
listAdapter.add(
records.getJSONObject(i).getString("Name"));
}
} catch (Exception e) {
onError(e);
}
}
});
}@Override
public void onError(Exception exception)
{
runOnUiThread((new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
MainActivity.this.getString(R.string.sf__generic_error,
exception.toString()),
Toast.LENGTH_LONG).show();
}
});
}