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 のインスタンスを直接作成しないでください。代わりに、SalesforceSDKManager.getInstance().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() メソッド
MainActivity クラスは、REST 要求を送信し、その後、REST 応答を使用してリストビューに入力します。このフローを追跡するために、MainActivity をもう一度詳しく見てみましょう。
- Android Studio のプロジェクトウィンドウで、[app] | [src] | [com.mytrail.android] を展開します。
-
[MainActivity] をダブルクリックします。
- onFetchContactsClick メソッドを見つけます。この小さなメソッドは SOQL ステートメントを使用して sendRequest() メソッドをコールします。
fun onFetchContactsClick(v: View) {
sendRequest("SELECT Name FROM Contact")
}- 「sendRequest」を右クリックし、[Go To (異動)] | [Implementation(s) (実装)] を選択します。sendRequest() は MainActivity クラスの非公開メソッドであることがわかります。このメソッドは後で変更するため、自分のものだったことは幸いでした。
sendRequest() メソッドでは、Mobile SDK REST クラスの動作を見ることができます。主に次のものがあります。
- client — 非公開でクラス範囲の RestClient のインスタンス。このオブジェクトはアプリケーションの初期化中に自動的にインスタンス化されます
- restRequest — 新しい RestRequest インスタンス
- RestRequest.getRequestForQuery() — RestRequest インスタンスを作成する静的な RestRequest ファクトリメソッド
- AsyncRequestCallback — アプリケーションでの REST 応答コールバックインターフェースの実装
REST 要求を作成する
sendRequest() 内で、RestRequest.getRequestForQuery() ファクトリメソッドは、SOQL 文字列を取り、RestRequest オブジェクトでラップします。
val restRequest = RestRequest.getRequestForQuery(ApiVersionStrings.getVersionNumber(this), soql)
RestRequest ファクトリメソッドを使用する利点は、生成されたオブジェクトがネットワーク対応していることです。Salesforce サーバーに対して必要な HTTP 設定がすでに含まれています。
REST 要求を送信する
Salesforce に要求を送信するには、RestRequest オブジェクトを RestClient.sendAsync() メソッドに渡します。
client!!.sendAsync(restRequest, object : AsyncRequestCallback
{
...Mobile SDK コードは、アクティビティの初期化中に client オブジェクトを作成します。2 番目のパラメーターは、AsyncRequestCallback 型で、REST 応答を受信するように設計された仮想インターフェースのインスタンスです。この例では、AsyncRequestCallback はインラインで実装およびインスタンス化されています。
async プレフィックスが何度も出てきています。これは何か重要な意味がありそうですね。要求を非同期で送信するということは、アプリケーションのコードが応答を待つために一時停止しないということです。応答が到着したときには、Mobile SDK はコールバックメソッドのいずれかをコールし、アプリケーションは進行中の処理を一時的に停止して応答を処理します。コードがメイン (UI) スレッドで実行される場合は、非同期で要求を送信する必要があります。
REST 応答を取得して処理する
Salesforce が REST 応答を返すと、RestClient オブジェクトはそれを AsyncRequestCallback 実装に転送します。AsyncRequestCallback インターフェースでは、アプリケーションが Salesforce からの REST 応答を処理する方法を定義します。成功時の REST 応答は onSuccess() メソッド内で処理します。
override fun onSuccess(request: RestRequest, result: RestResponse) {
result.consumeQuietly() // consume before going back to main thread
runOnUiThread {
try {
listAdapter!!.clear()
val records = result.asJSONObject().getJSONArray("records")
for (i in 0..<records.length()) {
listAdapter!!.add(records.getJSONObject(i).getString("Name"))
}
} catch (e: Exception) {
onError(e)
}
}
}そして、onError() メソッドでは、失敗した要求から適切に回復します。
override fun onError(exception: Exception) {
runOnUiThread {
Toast.makeText(this@MainActivity,
this@MainActivity.getString(R.string.sf__generic_error),
Toast.LENGTH_LONG,
).show()
}
}REST 応答は JSON 形式で受信されるため、コードを記述する人間が解析しやすくなっています。クエリに成功した場合、アプリケーションは名前項目値を抽出して UI リストビューに入力します。クエリに失敗した場合、アプリケーションはトーストでエラーメッセージを表示します。
リソース
- Salesforce 開発者: REST API 開発者ガイド
- Salesforce 開発者: Using REST APIs
- Salesforce 開発者: RestClient クラス
- Salesforce 開発者: RestRequest クラス
- 外部リソース: Postman 学習センター
