Retrofit
: Android ์ Java ํ๊ฒฝ์์ HTTP API๋ฅผ ์ฝ๊ณ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. REST API ํต์ ์ ์ํด ๊ตฌํ๋์๋ค.
โ
โ
REST API ์ค๋ช
https://blog.naver.com/88yhtserof/222208916350
[Android] ์๋๋ก์ด๋ REST API
โHTTP (Hypertext Transfer Protocol: ํ์ดํผ๋ณธ๋ฌธ ์ ์ก๊ท์ฝ) : ์ธํฐ๋ท์์, ์น ์๋ฒ์ ์ฌ์ฉ์์ ์ธ...
blog.naver.com
โ
โ
โ
โ
โ
โ
โ
Retrofit2 ๋ฅผ ์ด์ฉํ JSON ๋ฐ์ดํฐ HTTP ํต์
โ
Retrofit2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Gradle ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ค๋ค.โ
dependencies{ implementation 'com.squareup.retrofit2:retrofit:(๋ง์ง๋ง ๋ฒ์ )' }
2021.01.21 ๊ธฐ์ค 2.9.0 ๋ฒ์ ์ด ๊ฐ๋ฅ ๋ง์ง๋ง ๋ฒ์ ์ด๋ค. ๋ฒ์ ํ์ธ: https://github.com/square/retrofit
โ
โ
โ
โ
โ
Retrofit์ HTTP API ๋ฅผ ์ธํฐํ์ด์ค ํํ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ,
์ฝํ๋ฆฐ ์ฌ์ฉ ์ ์๋์ ์์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
public interface RetrofitInterface { @HTTP์์ฒญ๋ฉ์๋("/๋๋ ํ ๋ฆฌ/ํ์ผ๋ช ") fun ํจ์๋ช ( @Annotation("๋ณ์") ๋ณ์: ๋ณ์ ์๋ฃํ ): Call<Response์๋ฃํ,์ฆ ์ฃผ๊ณ ๋ฐ์ ๊ฐ์ฒด)> }
โ
์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ตฌ์ฑ์์๋ก REST API ํต์ ์ ํ์ํ Annotation์ด ์๋ค.
Annotation | ์ค๋ช | ์์ |
@GET | โ HTTPํต์ ์ ์ฌ์ฉ๋๋ method ์ค GET ์์ฒญ์ ๋ช ์ํ๋ค. โ |
โ |
@Path | โ URL ๋ถ๋ถ ์ค ์ผ๋ถ์ ๊ฒฝ๋ก๊ฐ ํ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉ ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉฐ ๋ฌธ์์ด์ ์ ์ ํด๋๋ฉด ํด๋น ๋ฌธ์์ด์ URL ๋ถ๋ถ ์ผ๋ถ์ ๋ฐ์ธ๋ฉํ์ฌ ๋์ ์ผ๋ก URL์ ๋ง๋ค ์ ์๋๋ก ๋์์ค๋ค. โ |
//๊ฒ์ โ @GET("/search/{word}") fun requestSearch( @Path("word") word:String ): Call<Response์๋ฃํ> โ |
@Query | GET ๋ฐฉ์์์๋ง ๊ฐ๋ฅํ Annotation. ์์์ ๊ฒฝ์ฐ, id์ "2021" ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค๋ฉด http://๋๋ฉ์ธ/post?postId=2021 ์ ํธ์ถํ๊ฒ ๋๋ค. โ |
//๊ฒ์๊ธ ์กฐํ โ @GET("/post") fun requestPost( @Query("postId") id String ): Call<Response์๋ฃํ> |
@Field | โ ์ฃผ๋ก POST ๋ฐฉ์์ ํต์ ์ ํ ๋ ์ฌ์ฉํ๋ Annotation(Patch ๋ฐฉ์์์๋ ์ฌ์ฉ, GET์์๋ ์ฌ์ฉ๋ถ๊ฐ) Field ํ์์ ์ฌ์ฉํ ๋์๋ Form์ด Encoding ๋์ด์ผํ๋ค. ๋ฐ๋ผ์ @ FormUrlEncoding Annotation๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค. โ |
//๋น๋ฐ๋ฒํธ ์ค์ โ @FormUrlEncoding @POST("/user/{userId}") fun requestPassword( @Path("userId") id:String, @Field("password") password:String ): Call<Response์๋ฃํ> |
@FieldMap | โ Field ํ์์ ํตํด ๋๊ฒจ์ฃผ๋ ๊ฐ๋ค์ด ์ฌ๋ฌ๊ฐ์ผ ๋ @FieldMap Annotation ์ ์ฌ์ฉํ๋ค. Retrofit์์๋ HashMap์ ๊ถ์ฅํ๋ค. โ |
โ |
@Part | โ Mutipart ์์ฒญ ์ ์ฌ์ฉํ๋ฉฐ @Multipart Annotation๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค. (๋์ค์ ๋ค์ ์์๋ณด๊ธฐ) โ |
โ |
@Headers/ @Header |
โ ์ ์ ํค๋๋ค์ @Headers๋ฅผ ํตํด ๋ช ์ํ ์ ์๋ค. +๊ฐ์ ์ด๋ฆ์ด์ด๋ ๊ฐ์ ๋ฎ์ด์์ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ด๋ฆ์ ํค๋๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด ๋์ผํ ์ด๋ฆ์ผ๋ก ์์ฒญ์ ์ถ๊ฐ๋๋ค. / ๋์ ํค๋๋ @Header ๋ฅผ ํตํด ๋ช ์ํ ์ ์๋ค. ๋ฐ๋์ @Header ์ ๋์ํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํด์ผํ๋ค. โ |
//์ ์ ํค๋ @Headers( "~:~" ) โ //๋์ ํค๋ fun ํจ์๋ช ( @Headers("๋ณ์") ๋ณ์: ๋ณ์์๋ฃํ ) |
@Body | ์ ์กํ๋ ๊ฐ์ด ํน์ JSON ํ์์ผ ๋ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ๋๊ฒจ์ฃผ๋ ํ์ | //user ๋ฐ์ดํฐ ํด๋์ค๊ฐ ์์ ๋ data class User( val name:String, val nickname:String ) โ //user ์ ๋ณด ์์ @PUT("/user/{userId}") fun requestUserUpdate( @Path("userId") id:String, @Body body: User ): Call<Response์๋ฃํ> |
โ
โ
โ
โ
โ
โ
ํค๋๋ฅผ ๋ชจ๋ ์์ฒญ๋ง๋ค ์ถ๊ฐํด์ผํ๋ค๋ฉด, OkHttp interceptor ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค.
โ
OkHttp
: HTTP๋ฅผ ๊ฐํธํ๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ Client
interceptor:ํน์ Url ์์ฒญ์ Controller๋ก ๊ฐ๋ ์์ฒญ์ ๊ฐ๋ก์ฑ๋ค.
โ
โ
OkHttp ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Gradle ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ค๋ค.
๋ฒ์ ํ์ธ: https://github.com/square/okhttp
dependencies{ implementation 'com.squareup.okhttp3:okhttp:(๋ง์ง๋ง ๋ฒ์ )' }
โ
ํต์
Retrofit ํด๋์ค๋ฅผ ์ด์ฉํด API์ฃผ์๊ฐ ์ฐ๊ฒฐ๋๋๋ก retrifit ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์์ฑํ๋ค.
object RequestToServer { private const val EveryHeader="๋ชจ๋ ํค๋" //๋ก๊ทธ ๊ธฐ๋ก์ ์ฌ์ฉํ HttpLoggingInterceptor val httpLoggingInterceptor =HttpLoggingInterceptor() .setLevel(HttpLoggingInterceptor.Level.BODY) //๊ณ ์ ํค๋ ๊ฐ์ ์ฌ์ฉํ Interceptor val headerInterceptor = Interceptor{ //Interceptor ์ธํฐํ์ด์ค val request = it.request() .newBuilder() .addHeader("EveryHearder", EveryHeader) //ํค๋ ์ถ๊ฐ .build() return@Interceptor it.proceed(request) //request๊ฐ ์คํํ ์ฐ๊ฒฐ ๋ฐํ } //client val client: OkHttpClient=OkHttpClient.Builder() .addInterceptor(headerInterceptor) //Interceptor ์ถ๊ฐ .build() //Retrofit ๋น๋ var retrofit: Retrofit = Retrofit.Builder() .baseUrl(์ฃผ์) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build() val api:RetrofitInterface = retrofit.create(RetrofitInterface::class.java) }
addConverterFactory(GsonConverterFactory.create()) : ๊ฐ์ฒด์ JSON์ ์๋์ผ๋ก ๋ณํ์์ผ์ค๋ค.
โ
โ
โ
ํธ์ถ์ Retrofit2์ REST API ํต์ 2์์..
โ
โ
โ
โ
โ
+
JSON โJavaScript Object Notation
: ์์ฑ-๊ฐ ์ ๋๋ ํค-๊ฐ ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ์ค๋ธ์ ํธ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ธ๊ฐ์ด ์ฝ์ ์ ์๋ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐฉํ ํ์ค ํฌ๋งท์ด๋ค. JSON์ ์๋ฒํต์ ์ ์ฌ์ฉ๋๋ค.
์๋ฃํ์ผ๋ก๋ ๊ธฐ๋ณธ์๋ฃํ, ๋ฌธ์์ด, ๋ฐฐ์ด, ๊ฐ์ฒด๊ฐ ์๋ค.
{ "name": "์๋๋ฑ", "id": "20210117", "like": ["์ฌํ", "๊ทธ๋ฆผ"] }
โ
JSON ํ์์ผ๋ก ๋ฐ์ดํฐ ํด๋์ค ์์ฑ
data class DataClassItem ( val name:String, val nickname:String, val age:Int?,//null ํ์ฉ val like:ArrayList<String> )
โ
DataClassItem์ ์์๋ก ๊ฐ์ง ArrayList ์๋ฃํ ๋ฐ์ดํฐ ํด๋์ค
data class DataClass : ArrayList<DataClassItem>()
โ
โ
โ
โ
โ
โ
โ
โ
<๊ณต๋ถ ์๋ฃ>
https://blog.yena.io/studynote/2020/01/08/Android-Kotlin-Retrofit.html
โ Retrofit + OkHttp
โ Retrofit, HTTP Annotation
https://square.github.io/retrofit/
โ Retrofit ๊ณต์๋ฌธ์
โ
'Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] RecyclerView ์ญ์์ผ๋ก ๋ฐฐ์น / LayoutManager ์์ฑ (kotlin) (0) | 2021.06.18 |
---|---|
[Kotlin] ์ฝํ๋ฆฐ Array ์กฐ๊ฑด ๊ฒ์ ๋ฉ์๋ (any / all) (0) | 2021.06.18 |
URL ์ฃผ์์ ์๋ฏธ์ ๊ตฌ์ฑ (0) | 2021.06.18 |
[Android] ์๋๋ก์ด๋ REST API (0) | 2021.06.18 |
[Android] ์๋๋ก์ด๋ API (0) | 2021.06.18 |