チュートリアル: Android (Kotlin) アプリで保護された Web API を呼び出す
これは、Microsoft Entra 外部 ID を使用して保護された Web API を呼び出す方法について説明するチュートリアル シリーズの 4 番目のチュートリアルです。
このチュートリアルでは、次のことについて説明します。
- 保護された Web API を呼び出す
前提条件
少なくとも 1 つのスコープ (委任されたアクセス許可) と 1 つのアプリ ロール (アプリケーション アクセス許可) を発行する API 登録 (ToDoList.Read など)。 まだ行っていない場合は、サンプル Android モバイル アプリでの API の呼び出しに関する記事の手順に従って、機能する保護された ASP.NET Core Web API を用意します。 次の手順を完了してください。
- Web API アプリケーションを登録する
- API スコープを構成する
- アプリ ロールを構成する
- 省略可能な要求の構成
- サンプル Web API を複製またはダウンロードする
- サンプル Web API を構成して実行する
API を呼び出す
Android アプリケーションから Web API を呼び出して外部データまたはサービスにアクセスするには、まず、
MainActivity
クラスにコンパニオン オブジェクトを作成します。 コンパニオン オブジェクトには、次のコードを含める必要があります。companion object { private const val WEB_API_BASE_URL = "" // Developers should set the respective URL of their web API here private const val scopes = "" // Developers should append the respective scopes of their web API. }
コンパニオン オブジェクトによって、2 つのプライベート定数 (開発者が Web API の URL を設定する
WEB_API_BASE_URL
と、開発者が Web API のそれぞれのscopes
を追加するscopes
) が定義されます。Web API にアクセスするプロセスを処理するには、次のコードを使用します。
private fun accessWebApi() { CoroutineScope(Dispatchers.Main).launch { binding.txtLog.text = "" try { if (WEB_API_BASE_URL.isBlank()) { Toast.makeText(this@MainActivity, getString(R.string.message_web_base_url), Toast.LENGTH_LONG).show() return@launch } val apiResponse = withContext(Dispatchers.IO) { ApiClient.performGetApiRequest(WEB_API_BASE_URL, accessToken) } binding.txtLog.text = getString(R.string.log_web_api_response) + apiResponse.toString() } catch (exception: Exception) { Log.d(TAG, "Exception while accessing web API: $exception") binding.txtLog.text = getString(R.string.exception_web_api) + exception } } }
このコードでは、メイン ディスパッチャーでコルーチンが起動されます。 まず、テキスト ログがクリアされます。 その後、Web API のベース URL が空白かどうかが確認され、そうである場合は、トースト メッセージが表示され、返されます。 次に、バックグラウンド スレッドで指定されたアクセス トークンを使用して、Web API に対する GET 要求が実行されます。
API 応答を受信した後、応答コンテンツでテキスト ログが更新されます。 このプロセス中に例外が発生した場合は、例外がログに記録され、対応するエラー メッセージでテキスト ログが更新されます。
コールバックを指定するコードでは、
performGetApiRequest()
という関数を使用します。 関数には次のコードが必要です。object ApiClient { private val client = OkHttpClient() fun performGetApiRequest(WEB_API_BASE_URL: String, accessToken: String?): Response { val fullUrl = "$WEB_API_BASE_URL/api/todolist" val requestBuilder = Request.Builder() .url(fullUrl) .addHeader("Authorization", "Bearer $accessToken") .get() val request = requestBuilder.build() client.newCall(request).execute().use { response -> return response } } }
このコードにより、Web API に対する
GET
要求が容易になります。 main メソッドはperformGetApiRequest()
であり、Web API のベース URL とアクセス トークンをパラメーターとして受け取ります。 このメソッド内では、ベース URL に/api/todolist
を追加することで完全な URL が構築されます。 その後、アクセス トークンを含む承認ヘッダーなど、適切なヘッダーを含む HTTP 要求が構築されます。最後に、OkHttp の
newCall()
メソッドを使用して同期的に要求が実行され、応答が返されます。ApiClient
オブジェクトでは、HTTP 要求を処理するためにOkHttpClient
のインスタンスが維持されます。OkHttpClient
を使用するには、依存関係implementation 'com.squareup.okhttp3:okhttp:4.9.0'
を Android Gradle ファイルに追加する必要があります。必ず import ステートメントを含めます。 Android Studio では、自動的に import ステートメントが含められます。