https://goni95.tistory.com/173
HTTP
인터넷 상에서 HTML 문서와 같은 데이터를 링크 기반으로 주고받기 위한 프로토콜(통신 규약)으로, 서버-클라이언트 모델(클라이언트 - 요청 / 서버 - 응답)을 따라는 애플리케이션 프로토콜로 TCP/IP(OSI 4계층) 위에서 작동합니다.
HTTPS
HTTP + Secure Socket(보안 통신)의 약자로 모든 통신 내용을 암호화하며, 공개키 암호화 방식을 사용합니다.
REST
Representational State Transfer이라는 용어의 약자로 HTTP URI를 통해 자원(이미지, 동영상, DB 데이터 등)을 명시하고 HTTP Method(POST, GET, PUT, DELETE)를 통해 자원(URI)에 대한 CRUD 작업을 처리하도록 설계된 아키텍처(시스템 설계를 위한 설계도)를 의미합니다.
REST의 구성요소는 서버에 존재하는 고유한 ID를 가진 자원(URL), HTTP 프로토콜의 Method인 행위(HTTP Method), Client가 저원의 상태(정보)에 대한 조작을 요청하여 서버로 부터 받은 응답인 표현(JSON, XML)으로 이루어집니다.
API
정보 제공자가 제공하는 기능에 대해 응용 프로그램에서 사용할 수 있도록 만든 인터페이스
즉, REST API는 REST 아키텍처의 제약조건을 준수하는 API를 의미합니다.
1️⃣OkHttp
REST API 및 서버와 HTTP 기반의 요청 및 응답의 편의성 제공을 위한 클라이언트 라이브러리이고 Retrofit 라이브러리의 베이스가 됩니다.
1. 네트워크 통신을 위한 권한 추가
<uses-permission android:name="android.permission.INTERNET" />
2. 모듈 수준의 build.gradle에 OkHttp3 라이브러리와 Gson 사용을 위한 종속성 추가
def okhttp_version = "4.8.1"
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
// Gson (json의 자바 오브젝트 직렬화를 위해 사용)
def gson_version = "2.8.6"
implementation "com.google.code.gson:gson:$gson_version"
2. 요청에 대한 응답과 관련된 data class
data class PapagoDTO(var message : Message? = null) {
data class Message(var result : Result? = null) {
data class Result(var translatedText : String? = null)
}
}
3. 네트워크 통신을 담당하는 HTTPConnection class 정의
class HTTPConnection {
private val clientId : String = "..."
private val clientSecret : String = "..."
companion object{
val instance = HTTPConnection()
}
fun request(text: String, source: String?, target: String?) {
// 파파고 restapi에 요청, 응답을 위한 코드
val url = "https://openapi.naver.com/v1/papago/n2mt" // papago 개발자센터 주소
val JSON: MediaType = "application/json; charset=utf-8".toMediaType() // 언어 포맷
val client = OkHttpClient() // okhttp 사용하기 위해 선언
val json = JSONObject() // JSONObject 사용을 위해 선언
json.put("source", keyword(source)) // 요청할 때 언어
json.put("target", keyword(target)) // 응답할 때 언어
json.put("text", text) // 번역하고자하는 구문
val body = json.toString().toRequestBody(JSON)
val request = Request.Builder()
.header("X-Naver-Client-Id", clientId)
.addHeader("X-Naver-Client-Secret", clientSecret)
.url(url)
.post(body)
.build()
//client에게 요청하고 응답을 받음
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.d("onFailure ", "요청을 실패했습니다.")
}
override fun onResponse(call: Call, response: Response) {
val str = response.body!!.string()
val ppg = Gson().fromJson<PapagoDTO>(str, PapagoDTO::class.java)
Log.d("onResponse ", "${ppg.message!!.result!!.translatedText}")
}
})
}
private fun keyword(value: String?) : String {
when (value) {
"독일어" -> return "de"
"러시아어" -> return "ru"
"베트남어" -> return "vi"
"스페인어" -> return "es"
"이탈리아어" -> return "it"
"인도네시아어" -> return "id"
"일본어" -> return "ja"
"영어" -> return "en"
"중국어 간체" -> return "zh-CN"
"중국어 번체" -> return "zh-TW"
"태국어" -> return "th"
"프랑스" -> return "fr"
"한국어" -> return "ko"
else -> return "ko"
}
}
}
4. HTTPConnection 객체를 통해 요청 시 사용법
HTTPConnection.instance.request("안녕","한국어","영어")
2️⃣OkHttp Interceptor
OkHttp Interceptor란 네트워크 통신을 하는 중간에 요청 및 응답을 가로채어 Header 추가, Request 본문 변경, Debug에 도움되는 Log 생성, 요청 재시도 등의 작업을 할 수 있습니다.
Interceptor를 생성하려면 필수 메소드인 intercpet(chain : Interceptor.Chain)란 메소드가 있는 Interceptor 인터페이스를 상속받은 Class를 구현하면 됩니다.
여기서 중요한 점은 intercept() 메소드에 반환값은 chain.proceed(request) 메소드를 호출하여 서버로 부터 반환된 응답값이라는 것입니다.
Interceptor의 유형에는 Application, Network Interceptor가 있고, Application Interceptor는 애플리케이션 코드와 OkHttp Core 라이브러리 사이에 추가되는 인터셉터로 addInterceptor() 메소드를 사용하여 추가한 것들 입니다. Network Interceptor는 OkHttp Core 라이브러리와 서버 사이에 추가되는 Interceptor로 addNetworkInterceptor()를 사용하여 OkHttpClient에 추가할 수 있습니다.
'Android > Android의 모든 것' 카테고리의 다른 글
👋Android의 모든 것 : 1️⃣App Manifest, 2️⃣Context (0) | 2022.03.16 |
---|---|
👋Android의 모든 것 : 1️⃣Android, 2️⃣Android SDK, 3️⃣Platform Architecture (0) | 2022.03.16 |
👋Android의 모든 것 : 1️⃣안드로이드에서 백그라운드 작업(Service, IntentService, JobintentService , WorkManager) (0) | 2022.03.11 |
👋Android의 모든 것 : 1️⃣ListView, 2️⃣RecyclerView (0) | 2022.03.07 |
👋Android의 모든 것 : 1️⃣ViewBinding | DataBinding (0) | 2022.03.05 |