[Android] Retrofit2↔REST API

JINA·2022년 2월 21일
0

Android/network

목록 보기
1/1
post-thumbnail

REST

REST(REpresentational State Transfer)란 자원의 표현에 의한 상태 전달을 뜻함.
REST는 네트워크 상에서 client와 server 사이의 통신 방식 중 하나로 프로토콜이나 표준이 아닌 아키텍처 스타일이다.

REST API

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)은 프로그래밍 언어에 구애받지 않고 사람과 기계 모두가 읽을 수 있기 때문에 가장 일반적으로 사용되는 파일 형식이다.

REST 아키텍처 가이드라인

  1. client-server
  2. stateless
  3. cache
  4. uniform interface
  5. layered system
  6. code-on-demand (optional)
    자세한 내용

RESTful API

RESTful API는 위의 REST의 가이드라인을 잘 준수하는 API를 뜻한다.


Retrofit2↔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

  1. DTO (POJO)작성 - 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
  2. interface 정의
  3. Retrofit2 인스턴스 생성

간단하게 사용해보기

retrofit2 관련 라이브러리 추가 및 manifest에 인터넷 권한 추가
🔽
interface 작성

interface LoginService {
    @FormUrlEncoded
    @POST("/app_login/")
    fun requsetLogin(
        @Field("userid") userid:String,
        @Field("userpw") userpw:String

    ) : retrofit2.Call<LoginResponse>
}
  • API 인터페이스를 생성 후 어노테이션을 이용하여 HTTP Method인 POST, GET, PUT, DELETE를 설정
  • Call은 응답이 왔을때 Callback으로 불려질 타입으로 LoginService를 통하여 HTTP 요청을 원격 웹서버로 보낼 수 있음.
  • 만약 헤더를 모든 요청마다 추가해야하면 한다면 OkHttp interceptor를 사용하기

DTO

class LoginResponse(val code: String, val msg: String) {
}
  • Rest API의 데이터 구조에 맞게 생성
  • JSON 데이터의 속성명과 변수명 + 타입(ex String,Int,Boolean)이 일치 해야함.
  • @SerializedName을 사용하면 변수명과 값의 명이 다르거나 순서가 달라도 알아서 맞춰서 들어감.

Retrofit.Build를 통해 Retrofit 인스턴스 생성

  • baseUrl, Converter, Client 설정
  • converter은 여러개 추가 가능
  • addConverterFactory에는 GsonConverter를 추가하여 JSON 형식을 DTO Class 형식으로 자동변환해줌.
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>) {
                    //정상응답이 올 경우
                 
                }
                }
  • 비동기 enqueue 작업으로 실행, 통신종료 후 이벤트 처리를 위해 Callback 등록
  • onResponse, onFailure 메인스레드에서 처리

0개의 댓글