Present time : 2018-07-06 Fri
Last Updated :
- β
- Retrofitμ HTTP APIλ₯Ό μλ° μΈν°νμ΄μ€ ννλ‘ μ¬μ©ν μ μμ΅λλ€.
- Java 7 μ΄μ, Android 2.3 μ΄μμμλ§ μ¬μ©κ°λ₯ν©λλ€.
- URL νλΌλ―Έν° μΉνκ³Ό 쿼리 νλΌλ―Έν°κ° μ§μλ©λλ€.
- κ°μ²΄λ₯Ό μμ² bodyλ‘ λ³νν©λλ€. (μ: JSON, protocol buffers)
- λ©ν°ννΈ μμ² bodyμ νμΌ μ λ‘λκ° κ°λ₯ν©λλ€.
μΈν°νμ΄μ€μ μ΄λ Έν μ΄μ κ³Ό λ©μλ 맀κ°λ³μλ€μ μμ²μ μ΄λ»κ² λ€λ£°μ§ μ§μν©λλ€.
λͺ¨λ λ©μλλ€μ λ°λμ μλ URLκ³Ό μμ² λ©μλλ₯Ό λͺ
μνλ μ΄λ
Έν
μ΄μ
μ κ°μ§κ³ μμ΄μΌν©λλ€. κΈ°λ³ΈμΌλ‘ μ 곡νλ μμ² λ©μλ μ΄λ
Έν
μ΄μ
μ λ€μκ³Ό κ°μ΄ 5κ°κ° μμ΅λλ€ : GET
, POST
, PUT
, DELETE
, HEAD
.
μ μ 쿼리 μΈμλ₯Ό URLμ λͺ μν μλ μμ΅λλ€.
@GET("/users/list?sort=desc")
μμ² URLμ λμ μΌλ‘ λΆλΆ μΉν κ°λ₯νλ©°, μ΄λ λ©μλ 맀κ°λ³μλ‘ λ³κ²½μ΄ κ°λ₯ν©λλ€. λΆλΆ μΉνμ μλ¬Έ/μ«μλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ {
μ }
λ‘ κ°μΈ μ μν΄μ€λλ€. λ°λμ μ΄μ λμνλ @Path
λ₯Ό λ©μλ 맀κ°λ³μμ λͺ
μν΄μ€μΌν©λλ€.
@GET("/group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
μ΄μΈμλ 쿼리 맀κ°λ³μλ λͺ μ κ°λ₯ν©λλ€. @Queryμ @QueryMapμ μ΄μ©νλ©΄ λ©λλ€.
HTTP μμ² λ³Έλ¬Έμ κ°μ²΄λ₯Ό @Body
μ΄λ
Έν
μ΄μ
μ ν΅ν΄ λͺ
μκ° κ°λ₯ν©λλ€.
@POST("/users/new")
Call<User> createUser(@Body User user);
μ΄λ¬ν κ°μ²΄λ€μ Retrofit
μΈμ€ν΄μ€μ μΆκ°λ 컨λ²ν°μ λ°λΌ λ³νλ©λλ€. λ§μ½ ν΄λΉ νμ
μ λ§λ 컨λ²ν°κ° μΆκ°λμ΄μμ§ μλ€λ©΄, RequestBody
λ§ μ¬μ©νμ€ μ μμ΅λλ€.
λ©μλλ form-encoded λ°μ΄ν°μ multipart λ°μ΄ν° λ°©μμΌλ‘ μ μ κ°λ₯ν©λλ€.
@FormUrlEncoded
μ΄λ
Έν
μ΄μ
μ λ©μλμ λͺ
μνλ©΄ form-encoded λ°μ΄ν°λ‘ μ μ‘ λ©λλ€. κ° key-value pairμ keyλ μ΄λ
Έν
μ΄μ
κ°μ, valueλ κ°μ²΄λ₯Ό μ§μνλ @Field
μ΄λ
Έν
μ΄μ
μΌλ‘ 맀κ°λ³μμ λͺ
μνμλ©΄ λ©λλ€.
@FormUrlEncoded
@POST("/user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
Multipart μμ²μ @Multipart
μ΄λ
Έν
μ΄μ
μ λ©μλμ λͺ
μνμλ©΄ λ©λλ€. κ° ννΈλ€μ @Part
μ΄λ
Έν
μ΄μ
μΌλ‘ λͺ
μν©λλ€.
@Multipart
@PUT("/user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
Multipartμ partλ Retrofit
μ 컨λ²ν°λ, RequestBody
λ₯Ό ν΅νμ¬ μ§λ ¬ν(serialization) κ°λ₯ν κ°μ²΄λ₯Ό μ¬μ©νμ€ μ μμ΅λλ€.
μ μ ν€λλ€μ @Headers
μ΄λ
Έν
μ΄μ
μ ν΅ν΄ λͺ
μν μ μμ΅λλ€.
@Headers("Cache-Control: max-age=640000")
@GET("/widget/list")
Call<List<Widget>> widgetList();
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("/users/{username}")
Call<User> getUser(@Path("username") String username);
λμ μΈ ν€λλ @Header
μ΄λ
Έν
μ΄μ
μ ν΅ν΄ λͺ
μ κ°λ₯ν©λλ€. λ°λμ μ΄μ λμνλ @Header
μ΄λ
Έν
μ΄μ
μ 맀κ°λ³μμ λͺ
μν΄μΌν©λλ€. λ§μ½ κ°μ΄ nullμ΄λΌλ©΄ ν΄λΉ ν€λλ μΆκ°λμ§μμ΅λλ€. μλλΌλ©΄, 맀κ°λ³μ κ°μ²΄μ toString
λ©μλλ₯Ό νΈμΆνμ¬ λ°νλ κ°μ ν€λμ κ°μΌλ‘ μΆκ°ν©λλ€.
@GET("/user")
Call<User> getUser(@Header("Authorization") String authorization)
Call
μΈμ€ν΄μ€λ λκΈ° νΉμ λΉλκΈ°λ‘ μμ² μ€νμ΄ κ°λ₯ν©λλ€. κ° μΈμ€ν΄μ€λ€μ λκΈ° νΉμ λΉλκΈ°μ€ νκ°μ§ λ°©μλ§ μ¬μ©κ°λ₯ν©λλ€, νμ§λ§ clone()
λ©μλλ₯Ό ν΅ν΄ μ μΈμ€ν΄μ€λ₯Ό μμ±νμλ©΄ μ΄μ κ³Ό λ€λ₯Έ λ°©μμ μ¬μ© κ°λ₯ν©λλ€.
μλλ‘μ΄λμμμ μ½λ°±λ€μ λ©μΈ μ€λ λμμ μ€νλ©λλ€. JVMμμλ, HTTP μμ²μ νΈμΆν μ€λ λμ λμΌν μ€λ λμμ μ½λ°±λ€μ΄ μ€νλ©λλ€.
μ°μ μμ£Ό μ¬μ© λ λ²ν λΉλκΈ°μ λ°©μμ ν΅μ μ μμμ μ΄λ―Έ μ¬μ©ν΄ λ³Έ enqueue()
methodλ₯Ό μ΄μ©νλ κ² μ
λλ€.
κ·Έλ λ€λ©΄ λ°λλ‘ λκΈ°μ λ°©μμ ν΅μ μ νλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉμ?
μμ±λ ν΄λΌμ΄μΈνΈ κ°μ²΄κ° μ 곡νκ³ μλ execute()
methodλ₯Ό enqueue()
method λμ μ΄μ©νλ©΄ λ©λλ€.
κΈ°λ³Έμ μΌλ‘, Retrofitμ HTTP μμ² λ³Έλ¬Έμ OkHttpμ ResponseBody
νμκ³Ό @Body
μ μ΄μ©νλ RequestBody
νμ
λ§ μμ§λ ¬ν(deserialization) ν μ μμ΅λλ€.
컨λ²ν°λ€μ μ΄μΈμ νμλ€μ λ³νν΄μ£Όλ μν μ ν©λλ€. μλμ λ§μ΄ μ¬μ©νκ³ νΈλ¦¬ν 컨λ²ν° 6κ°μ λΌμ΄λΈλ¬λ¦¬λ€μ μ¬μ©νμ€ μ μμ΅λλ€.
- Gson:
com.squareup.retrofit:converter-gson
- Jackson:
com.squareup.retrofit:converter-jackson
- Moshi:
com.squareup.retrofit:converter-moshi
- Protobuf:
com.squareup.retrofit:converter-protobuf
- Wire:
com.squareup.retrofit:converter-wire
- Simple XML:
com.squareup.retrofit:converter-simplexml
Gsonμ μ¬μ©νλ GitHubService
μΈν°νμ΄μ€κ° Gsonμ μμ§λ ¬νκ° κ°λ₯νκ² GsonConverterFactory
ν΄λμ€λ₯Ό ν΅ν΄ 컨λ²ν°λ₯Ό μΆκ°νλ μμ μ
λλ€.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
addConverterFactory()
methodλ₯Ό ν΅μ μ΄ μλ£λ ν, μ΄λ€ Converterλ₯Ό μ΄μ©νμ¬ λ°μ΄ν°λ₯Ό νμ±ν κ²μΈμ§μ λν μ€μ μ
λλ€.
μ£Όμν μ !
곡μλ¬Έμμμλ baseURL()
μ μ€μ λ μλ² URLμ /
κ° μμ΅λλ€.
νμ§λ§ μ€μ§μ μΌλ‘ μ¬λ¬κ°μ§ ν΅μ μ νλ©΄μ λ‘κΉ
μ ν΄λ³΄λ©΄ baseURL()
μ /
κ° μμ κ²½μ°, μμ² λμ΄μΌ ν URLμ μΌλΆκ° μλ €λκ°λ νμμ΄ λ°μνμ¬ μλͺ»λ κ²½λ‘λ‘ μμ²νλ νμμ΄ λ°μν μ μμ΅λλ€.
κ·Έλ¬λ κΌ baseURL()
μ μ€μ λλ URLμ λ§μ§λ§ κ²½λ‘μλ /
λ₯Ό ν¨κ» ν¬ν¨ν΄ μ£Όλλ‘ ν΄μΌν©λλ€!
λ§μ½ APIμ ν΅μ νλλ° Retrofitμ΄ μ§μνμ§ μλ νμ(e.g. YAML, txt, custom format) μ΄κ±°λ νμ¬ μ¬μ©κ°λ₯ν νμμ΄μ§λ§ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ ꡬννμκΈΈ μνμ λ€λ©΄, μ½κ² λλ§μ 컨λ²ν°λ₯Ό λ§λ€ μ μμ΅λλ€. Converter.Factory λ₯Ό μμνμ¬ λ§λμκ³ , μ΄λ₯Ό Retrofit κ°μ²΄λ₯Ό λ§λμ€λ μΆκ°νμλ©΄λ©λλ€.
λ§μ½ νλ‘μ νΈκ° Proguardλ₯Ό μ¬μ©νμλ©΄ μλ λ΄μ©μ μ€μ μ μΆκ°νμμμ€.
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions