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/ 폴더 안에 넣는다

 

 

 

 



글이 도움이 되셨다면 공감과 광고 클릭 한번 부탁드립니다! 💕
감사합니다 ✨