Tutorial: Chamar uma API Web protegida no aplicativo Android (Kotlin)
Este é o quarto tutorial da série de tutoriais que orienta você sobre como chamar uma API Web protegida usando a ID externa do Microsoft Entra.
Neste tutorial, você aprenderá a:
- Chamar uma API Web protegida
Pré-requisitos
Tutorial: Conectar usuários no aplicativo móvel Android (Kotlin)
Um registro de API que expõe pelo menos um escopo (permissões delegadas) e uma função de aplicativo (permissão de aplicativo), como ToDoList.Read. Caso você ainda não tenha feito isso, siga as instruções para chamar uma API em um aplicativo móvel Android de exemplo para ter uma API Web do ASP.NET Core funcional e protegida. Certifique-se de concluir as seguintes etapas:
- Registrar um aplicativo da API Web
- Configurar escopos de API
- Configurar funções de aplicativo
- Configurar declarações opcionais
- Clonar ou fazer download da API Web de exemplo
- Configurar e executar a API Web de exemplo
Chamar uma API
Para chamar uma API Web de um aplicativo Android para acessar dados ou serviços externos, comece criando um objeto complementar na sua classe
MainActivity
. O objeto complementar deve incluir o seguinte código: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. }
O objeto complementar define duas constantes privadas:
WEB_API_BASE_URL
, em que os desenvolvedores definem a URL da API Web, escopes
, em que os desenvolvedores acrescentam os respectivosscopes
da API Web.Para lidar com o processo de acesso a uma API Web, use o seguinte código:
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 } } }
O código inicia uma corrotina no dispatcher principal. Ele começa limpando o log de texto. Em seguida, verifica se a URL base da API Web está em branco; em caso afirmativo, ele exibe uma mensagem do sistema e retorna. Em seguida, ele executa uma solicitação GET para a API Web usando o token de acesso fornecido em um thread em segundo plano.
Depois de receber a resposta da API, ele atualiza o log de texto com o conteúdo da resposta. Se ocorrer alguma exceção durante esse processo, ele registrará a exceção e atualizará o log de texto com a mensagem de erro correspondente.
No código em que especificamos nosso retorno de chamada, usamos uma função chamada
performGetApiRequest()
. A função deve ter o seguinte código: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 } } }
O código facilita a realização de solicitações
GET
a uma API da Web. O método principal éperformGetApiRequest()
, que usa a URL base da API Web e um token de acesso como parâmetros. Dentro desse método, ele constrói uma URL completa acrescentando/api/todolist
à URL base. Depois, ele cria uma solicitação HTTP com os cabeçalhos apropriados, incluindo o cabeçalho de autorização com o token de acesso.Por fim, ele executa a solicitação de forma síncrona usando o método
newCall()
do OkHttp e retorna a resposta. O objetoApiClient
mantém uma instância deOkHttpClient
para lidar com solicitações HTTP. Para usarOkHttpClient
, é necessário adicionar a dependênciaimplementation 'com.squareup.okhttp3:okhttp:4.9.0'
ao arquivo Gradle do Android.Certifique-se de incluir as instruções de importação. O Android Studio deve incluir as instruções de importação para você automaticamente.