안드로이드에서 네트워크(API)를 처리할떄는 여러가지 방법이 있습니다.
기본 지원하는 urlconnection 를 사용하는 방법이 있고 외부 서드파티 라이브러리를 사용하는 방법이 있습니다.
예전에는 httpClient를 사용했으나 현재는 안드로이드에서는 공식적으로 지원하지 않습니다.
그래서 그 대용으로 사용하는 서드파티 라이브러리는 okHttp가 있습니다.
그중 오늘 소개할 retrofit(일명 레트로핏) 은 2.0부터는 okHttp를 사용하고 있습니다.
( 뭐 둘다 같은 회사에서 개발한거죠, 스퀘어사 만세! )
저같은 경우는 3가지 방식 모두 사용하는데 오늘은 레트로핏2 를 통해 간단하게 API통신하는걸 기록해봅니다.
1. 먼저 Gradle에 아래와 같은 dependencies 를 추가해줍니다
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
2. RestClient<T> 를 생성합니다.
RestClient 에서 Base URL을 설정하며, OkHttp 및 데이터를 파싱 GsonConverter 를 지정해줍니다.
public class DefaultRestClient<T> {
private T service;
private String baseUrl = "http://api.sample.com";
public T getClient(Class<? extends T> type) {
if (service == null) {
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("ex-hader", "sample")
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
}).build();
Retrofit client = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
service = client.create(type);
}
return service;
}
}
3. API 결과를 파싱할 Model 을 만듭니다. ( GSON )
- getter , setter 을 생성해주세요
@SerializedName("response")
private String response;
@SerializedName("name")
private String name;
@SerializedName("age")
private String age;
4. API 를 정의하고 호출할 interface 를 하나 만들어줍니다
- retrofit 은 기본적으로 GET,POST,PUT 등을 모두 지원합니다.
- 아래 예시에서는 주로 많이 사용하는 GET/POST만 설명하도록 하겠습니다.
- GET 으로 인자값을 넘길때는 @Path("version") int version 형식으로 해주시면 {version값} 이 넘어가게 됩니다
- GET의경우 {} 에 인자값을 넘길때는 @Path 로 하지만 &파라메터=값 형식으로 넘기실때는 @Query 를 사용해야 합니다
// GET URL자체에 param
@GET("app/{version}/{uuid}")
Call<Appinfo> getAppinfo(@Path("version") int version, @Path("uuid") String uuid);
// GET
@GET("notice")
Call<AppNotice> getAppNotice();
// POST
@FormUrlEncoded
@POST("update")
Call<Account> postUpdateProfile(@Field("test_a") String test_a,
@Field("test_b") String test_b);
5. API 호출 및 응답
- retrofit 은 API호출시 동기/비동기 모두 제공합니다.
- 동기의 경우 메인쓰레드 에서 처리할 수 없기 때문에 별도의 Async 나 쓰레드를 만들어서 처리해주어야 합니다
- 여기서는 주로 사용하는 비동기 방식만 설명하겠습니다. retrofit2 부터는 Callback 을 받지 않을경우 동기로 처리되기 때문에 큰차이는 없습니다
// Rest Client, api service 선언
DefaultRestClient<TestService> mowaDefaultRestClient;
TestService mTestService;
// init
mowaDefaultRestClient = new DefaultRestClient<>();
mTestService = mowaDefaultRestClient.getClient(TestService.class);
Call<Appinfo> call = mTestService.getAppinfo(value1, "value2");
call.enqueue(new Callback<Appinfo>() {
@Override
public void onResponse(Call<Appinfo> call, Response<Appinfo> response) {
if (response.isSuccessful()) {
// 호출성공
// 결과는 response.body() 에 Appinfo Model 형식으로 담겨집니다.
// Appinfo test = response.body(); 식으로 받으면 됩니다.
}else{
MowaLogWriter.d("##### 호출 실패 ##### ");
MowaLogWriter.d("##### errorBody() " + response.errorBody());
}
}
@Override
public void onFailure(Call<Appinfo> call, Throwable t) {
MowaLogWriter.d("오류 발생");
t.printStackTrace();
}
});
위와 같이 4 에서 만든 interface 의 api 를 호출하여 결과를 받을 수 있습니다.
1 에서 addConverterFactory 를 통해 GSON 파싱을 사용하도록 선언해주었기 때문에 response 는 Appinfo Model 형태로 받게됩니다.
retrofit1.x 에 비하면 retrofit2.x 는 좀더 사용하기 편해졌고 그동안 불편했던 것들이 많이 개선되었습니다.
이 글에서 설명한건 간한하게 호출/응답 만 하고 있으며 더 자세한 기능들은 retrofit 공식 문서를 참고하시면 됩니다.
공식 가이드는 아래를 참고하세요 :)
http://square.github.io/retrofit/
감사합니다.
'개발 > Android 개발 주저리' 카테고리의 다른 글
[Android] Picasso 이미지로드 라이브러리 사용시 오류 디버깅 하기 (0) | 2017.09.14 |
---|---|
Android 핫스팟(테더링)을 스마트하게 쓰기위한 모와(Mowa) 개발기 (13) | 2017.09.14 |
[Android] 비인증 SSL인증서 사용시 Android Studio에서 무시하고 clone하기 (0) | 2016.04.21 |
[Android] 안드로이드 페이스북 로그인 10초만에 구현하기 ( Facebook Login ) (4) | 2016.03.19 |
HttpURLConnection 사용시 참고사항 (0) | 2015.12.21 |