REST
는 서버에 존재하는 데이터에 접근하기 위한 규칙의 모음으로 행위,자원,표현으로 이루어져 있다
이러한 REST원칙을 잘 준수하는 API를RESTful API
라고 한다.
REST API
는 HTTP를 설계할 때 지켜야 할 아키텍처(= 청사진,가이드, 규칙, 지침서)인데 OkHttp랑 Retrofit은 이걸 간편하게 구현할 수 있도록 해준다. REST API를 쉽게 사용하기 위한 도구쯤으로 생각하면 될 것 같다.
Okhttp는 REST API, HTTP 통신을 간편하게 구현할 수 있도록 다양한 기능을 제공해주는 라이브러리이다. Retrofit이라는 라이브러리의 베이스가 된다.
그리고 Retrofit은 OkHttp를 기반으로 만들어진 친구이다.
유용한 정보 링크 참고하세욥
github소셜로그인참고
Retrofit쉽게 정리한 블로그/배민REST API써보기
retrofit간결 소개
ResponseWrapper
OkHttp사용해서 Header 빼기
interface GitHubService {
@GET("users/{user}/repos")
fun getRepoList(@Path("user") user: String): Call<List<Repo>>
}
- 안드로이드 프로젝트에 Internet 퍼미션 추가하기
- Retrofit 라이브러리(필요하다면 Gson도)를 프로젝트에 추가하기
- 서버 개발자와 필요한 데이터에 대해서 논의하는 시간 갖기(POST MAN)
- 서버 개발자가 만들어준 API 문서 확인하기(POST MAN)
<uses-permission android:name="android.permission.INTERNET" />
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.google.code.gson:gson:2.8.9'
//Gson라이브러리 추가implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//Gson 컨버터 라이브러리 추가Restful API
라고 함GET
:데이터를 서버에서 얻는 행위(조희)POST
:데이터를 서버에 제출하는 행위(저장)PUT
:서버의 데이터를 변경하는 행위(정보수정/갱신)DELETE
:서버의 데이터를 삭제하는 행위CRUD
를 할 수 있음 BASE URL
이 https://api.github.com 라는 것을 알 수 있음BASE URL
이란 데이터를 요청할 서버의 이름을 말함. 이 BASE URL
뒤에 붙는 것이 어떤 것인지에 따라 이 서버에 어떤 서비스를 요청하는 API인지 정해지게됨 GET
이 붙어있으므로 해당 API는 서버에 있는 데이터를 얻을 수 있는 API임/org/{org}/repos
부분은 BASE URL
뒤에 붙는 식별URL 부분임. 특정 계정 {org}
의 레포지토리 리스트 repos
를 얻을 수 있는 API라는 것을 알 수 있음각 행위를하는 메서드들은 요청헤더/요청바디/요청파라미터(요청쿼리)/응답바디 가 있을 수 있음 따라서 POST MAN에서 테스트 해볼때는 각 메서드에 필요한 헤더,요청쿼리,요청바디를 넣어서 테스트해야함
GET
:(요청헤더)+요청쿼리+응답바디POST
:(요청헤더)+요청바디+응답바디PUT
:(요청헤더)+요청바디+응답바디DELETE
:(요청헤더)+요청쿼리+응답바디POST MAN에서 테스트 해볼때는 식별URL 중 동적으로 변하는 부분은 직접 이메일이나 아이디를 넣어서 테스트해보면 됨
Header에 권한 토큰이 필요하다면 토큰 줄바꿈해서 쓰는거 주의!
Retrofit 사용법은 아래 3가지 단계로 진행
1. Retrofit Interface를 생성하고 Interface 안에 Request메서드 작성
2. Retrofit Interface의 실제 구현제 만들기
3. Request 메서드 호출해서 통신 처리하기
@GET("users/list")
@GET("users/list?sort=desc")
처럼 URL에 특정 쿼리 파라미터를 넣어주는 것도 가능함.HTTP어노테이션 아래에 Request메소드를 작성할 것.이때, Request메소드의 매개변수에는
1. API URL에서 동적으로 변경되어야 할 값들을 넣어줌
/orgs/{org}/repos
에서 {org}
부분은 계정 이름이기때문에 동적으로 바뀌는 부분임. 즉, 계정이름에 따라 가져올 데이터가 다르므로 {org}
로 되어있는 것.@Path("동적으로 변하는 부분의 URL 이름")
이라는 Retrofit 어노테이션을 변수 앞에 붙여줘야함.2. 리턴타입에는 Call<T>
인터페이스를 적어줘야함
Call<T>
라는 타입임 Call<T>
는 여러 메소드를 정의하고 있는 인터페이스로, T는 성공적으로 응답될 response body type의 클래스이고, 안드로이드에서 response body type의 클래스를 data class로 사용하고 있음. 즉, <>안에는 성공적으로 응답될 Body타입의 data class를 넣어주면 됨주의
interface SampleService {
@Headers("Content-Type:application/json") //Header에서 정의되는 부분
@POST("user/login") //HTTP메소드 + end point URL
fun postLogin(
@Body body:RequestLoginData //POST는 응답바디가 있기때문에 @Body어노테이션을 통해 요청바디를 정의
):Call<Data> //요청바디로 부터 받아온 데이터인 응답바디를 callback 타입으로 정의
}
interface GithubService {
@GET("/orgs/{org}/repos")
fun getRepoList(
@Path("org") username: String
):Call<GitRepositoryResponseData>
}
- data class작성
@Serializedname
어노테이션: data class를 작성할 때 각각의 변수마다 어노테이션을 붙이는게 보통인데 그 이유는, SerializedName이라는 이름 그대로 data class 객체가 json 포맷 데이터로 변환된 이름이라는 걸 명시하는 역할임 package com.example.kotlin_study.Server
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object ServiceCreator {
private val BASE_URL = "베이스"
private val retrofit: Retrofit = Retrofit.Builder() //레트로핏 빌더 생성(생성자 호출)
.baseUrl(BASE_URL) //빌더 객체의 baseURL호출=서버의 메인 URL정달
.addConverterFactory(GsonConverterFactory.create()) //gson컨버터 연동
.build() //객체반환
val sampleService: SampleService = retrofit.create(SampleService::class.java) //SampleService 인터페이스를 구현한 구현체
}
//인터페이스
interface SampleService {
@Headers("Content-Type:application/json") //Header에서 정의되는 부분
@POST( "user/login") //HTTP메소드 + end point URL
fun postLogin(
@Body body:RequestLoginData //POST는 응답바디가 있기때문에 @Body어노테이션을 통해 요청바디를 정의
):Call<Data> //요청바디로 부터 받아온 데이터인 응답바디를 callback 타입으로 정의
}
//인터페이스 구현한 싱글톤
object ServiceCreator {
private val BASE_URL = "https://asia-northeast3-we-sopt-29.cloudfunctions.net/api/"
private val retrofit: Retrofit = Retrofit.Builder() //레트로핏 빌더 생성(생성자 호출)
.baseUrl(BASE_URL) //빌더 객체의 baseURL호출=서버의 메인 URL정달
.addConverterFactory(GsonConverterFactory.create()) //gson컨버터 연동
.build() //객체반환
val sampleService: com.example.kotlin_study.Server.SampleService = retrofit.create(com.example.kotlin_study.Server.SampleService::class.java) //SampleService 인터페이스를 구현한 구현체
}
private fun initNetwork() {
val requestLoginData = RequestLoginData(
email = binding.etId.text.toString(),
password = binding.etPassword.text.toString()
)
val call: Call<Data> = ServiceCreator.sampleService.postLogin(requestLoginData)
call.enqueue(object : Callback<Data> {
override fun onResponse(
call: Call<Data>,
response: Response<Data>
) {
if (response.isSuccessful) {
Toast.makeText(this@ServerActivity,"성공",Toast.LENGTH_SHORT).show()
val data = response.body()?.email
Toast.makeText(this@ServerActivity, "${data}님 반갑습니다!", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@ServerActivity, "로그인 실패", Toast.LENGTH_SHORT).show()
}
}
override fun onFailure(call: Call<Data>, t: Throwable) {
Toast.makeText(this@ServerActivity, "로그인 실패", Toast.LENGTH_SHORT).show()
}
})
}
}