REST(REpresentational State Transfer)란 자원의 표현에 의한 상태 전달을 뜻함.
REST는 네트워크 상에서 client와 server 사이의 통신 방식 중 하나로 프로토콜이나 표준이 아닌 아키텍처 스타일이다.
API(Application Programming Interface)는 애플리케이션 소프트웨어를 구축하고 통합하는 정의 및 프로토콜 세트
API는 정보 제공자와 정보 사용자 간의 약속으로, 소비자에게 필요한 콘텐츠(호출)와 생산자에게 필요한 콘텐츠(응답)을 구성한다.
REST API란?
HTTP 요청을 보낼 때 어떤 URI에 어떤 메소드를 사용할지에 대한 약속
REST API를 통해 요청이 수행될때 REST API는 리소스 상태에 대한 표현을 요청자에게 하이퍼텍스트 전송 프로토콜(HTTP)을 통해 전송함.
이러한 요청을 수신하면 REST용으로 설계된 API(RESTful API 또는 RESTful 웹 서비스)가 HTML, XML, 일반 텍스트, JSON과 같은 다양한 형식으로 메시지를 반환할 수 있음.
JSON형식의 데이터 구조
{ "name" : "JINA", "age" : 23 }
- 중괄호 {} -> 객체
- 대괄호 [] -> 배열
- 내부에서는
key:value
로 각 속성 값을 정의
- key와 value는 콜론(:)에 의해 구분
- 각각의 속성은 쉼표(,)로 구분됨.
JSON(JavaScript Object Notation)은 프로그래밍 언어에 구애받지 않고 사람과 기계 모두가 읽을 수 있기 때문에 가장 일반적으로 사용되는 파일 형식이다.
RESTful API는 위의 REST의 가이드라인을 잘 준수하는 API를 뜻한다.
Retrofit2는 Android및 java에서 쓸 수 있는 REST 클라이언트이다.
Retrofit2는 JSON 구조에 대해 정의해야 하는 POJO(Plain Old Java Object)를 사용하여 JSON 응답을 자동으로 직렬화하는데,(파싱 필요없음)
JSON을 직렬화하려면 먼저 Gson 으로 변환하는 컨버터가 필요함.
일반적으로 JSON의 경우 GSON을 사용하지만 XML이나 기타 프로토콜을 사용하면 그에 맞는 converter을 추가할 수 있음.
- 직렬화: 객체를 직렬화하여 전송 가능한 형태로 만드는 것, 객체들의 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해준다.
- 역직렬화: 직렬화된 파일 등을 역으로 직렬화해서 다시 객체의 형태로 만드는 것, Stream 데이터를 읽어서 객체의 형태로 복원한다.
Retrofit2는 Rest API에서 사용하는 CURD 기능을 모두 제공한다.
POST(create), PUT(update), GET(read), DELETE(delete) 등을 annotation (@)을
활용하여 손쉽게 통신 코드를 작성할 수 있다.
Retrofit2는 기본적으로 OkHttp를 네트워킹 계층으로 활용하며 그 위에 구축된다.
OkHttp는 HTTP를 더 간편하고 효율적으로 쓸 수 있도록 도와주는 클라이언트 라이브러리임.
retrofit2 관련 라이브러리 추가 및 manifest에 인터넷 권한 추가
🔽
interface 작성
interface LoginService {
@FormUrlEncoded
@POST("/app_login/")
fun requsetLogin(
@Field("userid") userid:String,
@Field("userpw") userpw:String
) : retrofit2.Call<LoginResponse>
}
DTO
class LoginResponse(val code: String, val msg: String) {
}
@SerializedName
을 사용하면 변수명과 값의 명이 다르거나 순서가 달라도 알아서 맞춰서 들어감.Retrofit.Build를 통해 Retrofit 인스턴스 생성
var retrofit = Retrofit.Builder()
.baseUrl("http://")
.addConverterFactory(GsonConverterFactory.create()).build()
Interface 객체 구현
var loginService: LoginService = retrofit.create(LoginService::class.java)
통신작업 실행
LoginService.requsetLogin(id, pw).enqueue(object: Callback<LoginResponse>{
override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
//실패할 경우
}
override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
//정상응답이 올 경우
}
}