Kotlin] API 호출 메소드 및 오류
API 호출 테스트
https://jsonplaceholder.typicode.com/
JSONPlaceholder - Free Fake REST API
{JSON} Placeholder Free fake and reliable API for testing and prototyping. Powered by JSON Server + LowDB. Serving ~3 billion requests each month.
jsonplaceholder.typicode.com
@Composable
fun MyButton(modifier: Modifier = Modifier) {
// MainActivity의 handleButtonClick 함수를 직접 참조
Button(onClick = { this@MainActivity.handleButtonClick() }, modifier = modifier) {
Text("API 호출")
}
}
private fun handleButtonClick() {
Log.d("MainActivity", "MyButton Clicked!")
// API 호출을 위한 코루틴 시작 (lifecycleScope 사용)
lifecycleScope.launch(Dispatchers.IO) { // GlobalScope 대신 lifecycleScope 사용
try {
val urlString = "https://jsonplaceholder.typicode.com/todos/1"
val url = URL(urlString)
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
val responseCode = connection.responseCode
Log.d("MainActivity", "API Response Code: $responseCode")
if (responseCode == HttpURLConnection.HTTP_OK) {
val inputStream = connection.inputStream
val response = inputStream.bufferedReader().use { it.readText() }
Log.d("MainActivity", "API Response: $response")
} else {
Log.e("MainActivity", "API Error: Response Code $responseCode")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("MainActivity", "API Call Error: ${e.message}", e)
}
}
}
API Response Code: 200
API Response: {
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
1. 인터넷 권한 설정
Explain: API Call Error: Permission denied (missing INTERNET permission?) java.lang.SecurityException: Permission denied (missing INTERNET permission?) at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:150) at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103) at java.net.InetAddress.getAllByName(InetAddress.java:1152) with tag MainActivity
AndroidManifest.xml 에서 인터넷 사용 권한 추가
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
...
</application>
</manifest>
2. 인증서 오류
Explain: API Call Error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:356) at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1127) at com.android.org.conscrypt.ConscryptEngine.readPlaintextData(ConscryptEngine.java:1082) with tag MainActivity
현재 연결하려는 서버( https://jsonplaceholder.typicode.com )의 SSL/TLS 인증서를 신뢰하지 못하고 있음
개발/테스트 환경에서만 사용
1. res/xml/ 폴더에 network_security_config.xml 파일을 만듭니다
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">jsonplaceholder.typicode.com</domain>
<trust-anchors>
<!-- Trust user added CAs -->
<certificates src="user" />
<!-- OR trust a specific certificate packaged with your app -->
<certificates src="@raw/typicod" />
</trust-anchors>
</domain-config>
</network-security-config>
2. `AndroidManifest.xml` 파일의 `<application>` 태그 안에 이 파일을 참조하도록 추가합니다:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
3. 서버 인증서 파일을 res/raw/ 폴더 안에 넣는다


글이 도움이 되셨다면 공감과 광고 클릭 한번 부탁드립니다! 💕
감사합니다 ✨
댓글
이 글 공유하기
다른 글
-
Tibco Rendezvous Daemon 서비스 기동 오류
Tibco Rendezvous Daemon 서비스 기동 오류
2024.07.01 -
제조업 IT 직무 8년차 드는 생각 정리
제조업 IT 직무 8년차 드는 생각 정리
2024.03.22