CLEARTEXT communication to api.airvisual.com not permitted by network security policy
레트로핏을 사용해 데이터통신을 구현하는 중에 위와 같은 오류가 발생했다.
run 시 애뮬레이터의 화면에 "서버로부터 응답을 받아오지 못했습니다."라는 통신에 실패했다는 Toast메세지가 출력되었다.
오류가 난 부분의 코드는 아래와 같다.
private fun getAirQualityData(latitude: Double, longitude: Double) {
val retrofitAPI = RetrofitConnection.getInstance().create(AirQualityService::class.java)
retrofitAPI.getAirQualityData(
latitude.toString(),
longitude.toString(),
"21-a4d2...[API key]"
).enqueue(object : Callback<AirQualityResponse> {
override fun onResponse(call: Call<AirQualityResponse>, response: Response<AirQualityResponse>) {
if (response.isSuccessful) {
Toast.makeText(this@MainActivity, "최신 정보 업데이트 완료!", Toast.LENGTH_SHORT).show()
response.body()?.let {
updateAirUI(it) }
} else {
Toast.makeText(this@MainActivity, "업데이트에 실패했습니다.", Toast.LENGTH_SHORT).show()
}
}
// 다음 함수 부분을 타고 에러메세지 출력
override fun onFailure(call: Call<AirQualityResponse>, t: Throwable) {
t.printStackTrace()
Log.e("MyTag", "API 요청 실패: ${t.message}")
Toast.makeText(this@MainActivity, "서버로부터 응답을 받아오지 못했습니다.", Toast.LENGTH_SHORT).show()
}
})
}
에러메세지에서는 네트워크 보안 정책에 따라 api.airvisual.com에 대한 CLEARTEXT 통신이 허용되지 않았다고 한다.
이는 안드로이드 9.0 파이(Pie)에서는 네트워크 경로를 http가 아닌 https를 사용하도록 강제하기 때문에 발생한 오류인 것이다.
레트로핏 통신 구현 중에 에러가 났기 때문에 레트로핏 클래스의 레트로핏 객체 생성 부분에서 URL을 http에서 https로 수정하여 해결
수정 전
private const val BASE_URL = "http://api.[도메인].com/"
수정 후
private const val BASE_URL = "https://api.[도메인].com/"