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