進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

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 パッケージに含まれています。

  • ClientManagerRestClient インスタンスのファクトリとして機能します。また、アカウントログインや Salesforce サーバとのハンドシェイクも処理します。
  • RestClient — REST API 要求を Salesforce サーバに送信するためのプロトコルを処理します。

    RestClient のインスタンスを直接作成しないでください。代わりに、ClientManager.getRestClient() メソッドをコールします。

  • RestRequest — 提供したデータに基づいて書式設定された REST API 要求を表します。また、自身のインスタンスのファクトリとしても機能します。
    重要

    重要

    RestRequest のインスタンスを直接作成しないでください。代わりに、適切な RestRequest の静的 getter 関数 (RestRequest.getRequestForCreate() など) をコールします。

  • RestResponse — 要求された書式での応答コンテンツを含みます。RestRequest クラスは、RestResponse のインスタンスを作成し、RestClient.AsyncRequestCallback インターフェースの実装を介してアプリケーションに返します。

次に、このフローの動作を示すアニメーションダイアグラムを示します。

REST API ランタイムフロー (Android)
  1. アプリケーションは、RestRequest クラスの静的メソッドをコールし、設定された RestRequest インスタンスを作成します。
  2. アプリケーションは、新しい RestRequest インスタンスと AsyncRequestCallback インターフェースのインスタンスを RestClient.sendAsync() メソッドに渡します。
  3. Mobile SDK は、RestRequest オブジェクトで示された REST 要求を Salesforce クラウドサービスに送信します。
  4. Salesforce は要求を処理し、JSON 応答をアプリケーションに返します。
  5. Mobile SDK は、新しい RestResponse オブジェクトで JSON 応答をパッケージ化します。
  6. Mobile SDK は、使用できるように新しい RestResponse オブジェクトをアプリケーションの AsyncRequestCallback 実装に渡します。

まだ起きていますか? 概念的なレベルを越えて、この情報が動作しているところを実際のアプリケーションで見てみましょう。

sendRequest() メソッド

MainActivity クラスは、REST 要求を送信し、その後、REST 応答を使用してリストビューに入力します。このフローを追跡するために、MainActivity をもう一度詳しく見てみましょう。
  1. Android Studio のプロジェクトウィンドウで、[app] | [src] | [com.mytrail.android] を展開します。
  2. [MainActivity] をダブルクリックします。
  3. onFetchContactsClick メソッドを見つけます。この小さなメソッドは SOQL ステートメントを使用して sendRequest() メソッドをコールします。
    public void onFetchContactsClick(View v) throws UnsupportedEncodingException {
        sendRequest("SELECT Name FROM Contact");
    } 
  4. 「sendRequest」を右クリックし、[移動] | [実装] を選択します。sendRequest()MainActivity クラスの非公開メソッドであることが分かります。このメソッドは後で変更するため、自分のものだったことは幸いでした。
sendRequest() メソッドでは、Mobile SDK REST クラスの動作を見ることができます。主に次のものがあります。
  • client — 非公開でクラス範囲の RestClient のインスタンス。このオブジェクトはアプリケーションの初期化中に自動的にインスタンス化されます
  • restRequest — 新しい RestRequest インスタンス
  • RestRequest.getRequestForQuery()RestRequest インスタンスを作成する静的な RestRequest ファクトリメソッド
  • AsyncRequestCallback — アプリケーションでの REST 応答コールバックインターフェースの実装

REST 要求の作成

sendRequest() 内で、RestRequest.getRequestForQuery() ファクトリメソッドは、SOQL 文字列を取り、RestRequest オブジェクトでラップします。
RestRequest restRequest = 
    RestRequest.getRequestForQuery(
        getString(R.string.api_version), soql); 
RestRequest ファクトリメソッドを使用する利点は、生成されたオブジェクトがネットワーク対応していることです。Salesforce サーバに対して必要な HTTP 設定がすでに含まれています。

REST 要求の送信

Salesforce に要求を送信するには、RestRequest オブジェクトを RestClient.sendAsync() メソッドに渡します。
client.sendAsync(restRequest, new AsyncRequestCallback()
    { 
    ...
Mobile SDK コードは、アクティビティの初期化中に client オブジェクトを作成します。2 番目のパラメータは、AsyncRequestCallback 型で、REST 応答を受信するように設計された仮想インターフェースのインスタンスです。この例では、AsyncRequestCallback はインラインで実装およびインスタンス化されています。

「async」プレフィックスが何度も出てきています。これは何か重要な意味がありそうですね。要求を非同期で送信するということは、アプリケーションのコードが応答を待つために一時停止しないということです。応答が到着したときには、Mobile SDK はコールバックメソッドのいずれかをコールし、アプリケーションは進行中の処理を一時的に停止して応答を処理します。コードがメイン (UI) スレッドで実行される場合は、非同期で要求を送信する必要があります。

REST 応答の取得と処理

Salesforce が REST 応答を返すと、RestClient オブジェクトはそれを AsyncRequestCallback 実装に転送します。AsyncRequestCallback インターフェースでは、アプリケーションが Salesforce からの REST 応答を処理する方法を定義します。成功時の REST 応答は onSuccess() メソッド内で処理します。
@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);
             }
        }
    });
}
そして、onError() メソッドでは、失敗した要求から適切に回復します。
@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();
        }
    });
}
REST 応答は JSON 形式で受信されるため、コードを記述する人間が解析しやすくなっています。クエリに成功した場合、アプリケーションは名前項目値を抽出して UI リストビューに入力します。クエリに失敗した場合、アプリケーションはトーストでエラーメッセージを表示します。