다음을 통해 공유


자습서: Android(Kotlin) 앱에서 보호된 웹 API 호출

Microsoft Entra 외부 ID를 사용하여 보호된 웹 API를 호출하는 방법을 안내하는 자습서 시리즈의 네 번째 자습서입니다.

이 자습서에서는 다음을 수행합니다.

  • 보호된 웹 API 호출

필수 조건

  • 자습서: Android(Kotlin) 모바일 앱에서 사용자 로그인

  • ToDoList.Read와 같이 하나 이상의 범위(위임된 권한)와 하나의 앱 역할(애플리케이션 권한)을 노출하는 API 등록입니다. 아직 없는 경우 샘플 Android 모바일 앱에서 API 호출 지침에 따라 기능적으로 보호되는 ASP.NET Core 웹 API를 확보하세요. 다음 단계를 완료해야 합니다.

    • 웹 API 애플리케이션 등록
    • API 범위 구성
    • 앱 역할 구성
    • 선택적 클레임 구성
    • 샘플 웹 API 복제 또는 다운로드
    • 샘플 웹 API 구성 및 실행

API 호출

  1. Android 애플리케이션에서 웹 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.
    }
    

    도우미 개체는 개발자가 웹 API의 URL을 설정하는 WEB_API_BASE_URL과 개발자가 웹 API의 해당 scopes를 추가하는 scopes의 두 프라이빗 상수를 정의합니다.

  2. 웹 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
            }
        }
    }
    

    이 코드는 주 디스패처에서 코루틴을 시작합니다. 먼저 텍스트 로그를 지웁니다. 그런 다음, 웹 API 기본 URL이 비어 있는지 확인합니다. 비어 있으면 알림 메시지를 표시하고 반환합니다. 다음으로, 백그라운드 스레드에서 제공된 액세스 토큰을 사용하여 웹 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 }
        }
    }
    

    이 코드는 웹 API에 대한 GET 요청 수행을 용이하게 합니다. 주 메서드는 performGetApiRequest()로, 웹 API 기본 URL 및 액세스 토큰을 매개 변수로 사용합니다. 이 메서드 내에서 기본 URL에 /api/todolist를 추가하여 전체 URL을 생성합니다. 그런 다음, 액세스 토큰이 있는 권한 부여 헤더를 비롯한 적절한 헤더를 사용하여 HTTP 요청을 빌드합니다.

    마지막으로 OkHttp의 newCall() 메서드를 사용하여 요청을 동기적으로 실행하고 응답을 반환합니다. ApiClient 개체는 HTTP 요청을 처리할 OkHttpClient 인스턴스를 유지 관리합니다. OkHttpClient를 사용하려면 Android Gradle 파일에 종속성 implementation 'com.squareup.okhttp3:okhttp:4.9.0'을 추가해야 합니다.

    import 문을 포함했는지 확인합니다. Android Studio에는 import 문이 자동으로 포함되어야 합니다.