이전포스트

Retrofit2 + okhttp3 + Rxandroid 사용법

freemmer 2016. 4. 18. 17:39

출처 : http://tiii.tistory.com/11






OkHttp3에서 달라진 쿠키스토어 사용방법은 이후에 작성된 아래 포스트를 참고해 주세요.

http://tiii.tistory.com/13





Retrofit과 OkHttp 는 Square社(https://square.github.io/)에서 만든 오픈라이브러리 입니다. 

Retrofit : REST통신을 위한 클라이언트 라이브러리

OkHttp :  HTTP & HTTP/2 통신 클라이언트 라이브러리

Rxandroid : 안드로이드에서 Observer 패턴, Iterator 패턴을 사용 할 수 있게 하는 라이브러리

이 글을 아래와 같은 디펜던시를 사용합니다.

dependencies

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'

compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta3'

compile 'com.squareup.okhttp3:okhttp:3.0.1'

compile 'com.squareup.okhttp3:okhttp-urlconnection:3.0.1'

compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

compile 'com.google.code.gson:gson:2.5'


1.interface 만들기

REST API에 맞는 interface 파일을 만듭니다.

본 예제는 REST 통신 후 결과 값을 서버에서 Json Type으로 리턴해주는 것을 기본으로 설명합니다.

public interface sample_Interface {
//URL encoding하여 보냅니다.
//POST 방식, 파라메터는 @Field("파라메터명") 으로 보낼 수 있습니다.
//Json형식에 맞게 Bean객체를 만들어 두면 설정항 Parser가 자동으로 컨버팅해 돌려 줍니다.
@FormUrlEncoded
@POST("auth")
Call<AuthModel> Auth(@Field("email") String email, @Field("password") String password);
// Get방식, 파라메터는 @Query("파라메터명")으로 보낼 수 있습니다.
// Bean객체를 생성하지 않고 JsonObject로 받을 수 있습니다.
@GET("project")
Call<JsonObject> Project(@Query("email") String email);
// Get방식, 주소가 고정되지 않는 상황에서는 @Path를 통해 주소를 다이나믹하게 넣을 수 있습니다.
@GET("project/{project_id}/image")
Call<JsonObject> ProjectImagesList(@Path("project_id") String project_id);
//Rxandroid 사용
@GET("project")
Observable<JsonObject> Project();
}
view rawsample_Interface hosted with ❤ by GitHub

AuthModel은 getter, setter로 이루어진 Bean객체입니다. Json의 구조와 동일하게 구현되어 있어야 자동으로 파싱이 가능합니다.

auth.json

1
2
3
4
5
6
7
8
{
  "email""leeyc09@gmail.com",
  "nick_name""하하하하",
  "profile_modified""",
  "profile_thumb""",
  "storage_limit"10737418240,
  "storage_used"71243214
}
cs


AuthModel.java
parcelable 상속은 선택입니다.

public class AuthModel implements Parcelable {
public static final String TAG = LoginActivity.class.getSimpleName();
public static final String PARCELABLE_KEY = TAG + ":" + "ParcelableKey";
String email; //json의 name 과 동일해야 함.
String nick_name;
String profile_modified;
String profile_thumb;
long storage_limit;
long storage_used;
/*getter, setter */
...
}
view rawAuthModel.java hosted with ❤ by GitHub

2. RestfulAdapter 만들기

위에서 만든 interface를 사용할 수 있도록 Retrofit에 연결합니다.

public class RestfulAdapter {
public static final int CONNECT_TIMEOUT = 15;
public static final int WRITE_TIMEOUT = 15;
public static final int READ_TIMEOUT = 15;
private static final String SERVER_URL = "https://api.server.net/"; //2부터 url뒤에 /를 입력해야 합니다.
private static OkHttpClient client;
private static sample_Interface Interface;
public synchronized static sample_Interface getInstance() {
if (Interface == null) {
//통신로그를 확인하기 위한 부분
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//쿠키 메니저의 cookie policy를 변경 합니다.
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
//OkHttpClient를 생성합니다.
client = configureClient(new OkHttpClient().newBuilder()) //인증서 무시
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) //연결 타임아웃 시간 설정
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) //쓰기 타임아웃 시간 설정
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) //읽기 타임아웃 시간 설정
.cookieJar(new JavaNetCookieJar(cookieManager)) //쿠키메니져 설정
.addInterceptor(httpLoggingInterceptor) //http 로그 확인
.build();
//Retrofit 설정
Interface = new Retrofit.Builder()
.baseUrl(DIRECTFOLDER_SERVER)
.client(client)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //Rxandroid를 사용하기 위해 추가(옵션)
.addConverterFactory(GsonConverterFactory.create()) //Json Parser 추가
.build().create(samaple_Interface.class); //인터페이스 연결
}
return Interface;
}
/**
* UnCertificated 허용
*/
public static OkHttpClient.Builder configureClient(final OkHttpClient.Builder builder) {
final TrustManager[] certs = new TrustManager[]{new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(final X509Certificate[] chain,
final String authType) {
}
@Override
public void checkClientTrusted(final X509Certificate[] chain,
final String authType) {
}
}};
SSLContext ctx = null;
try {
ctx = SSLContext.getInstance("TLS");
ctx.init(null, certs, new SecureRandom());
} catch (final java.security.GeneralSecurityException ex) {
ex.printStackTrace();
}
try {
final HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(final String hostname, final SSLSession session) {
return true;
}
};
builder.sslSocketFactory(ctx.getSocketFactory()).hostnameVerifier(hostnameVerifier);
} catch (final Exception e) {
e.printStackTrace();
}
return builder;
}
}
view rawRestfulAdapter.java hosted with ❤ by GitHub


쿠키관리하기

JavaNetCookieJar를 사용하기 위해서는 디펜던시에 'com.squareup.okhttp3:okhttp-urlconnection:3.0.1'을 추가해야 합니다.

OkHttp3에서 달라진 쿠키스토어 사용방법은 이후에 작성된 아래 포스트를 참고해 주세요.
http://tiii.tistory.com/13




3.API 호출하기

호출이 필요한 method 내에서 아래와 같이 호출 하면 사용 할 수 있습니다.


Call<JsonObject> jsonObjectCall = sample_RestfulAdapter.getInstance().Project();
jsonObjectCall.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Response<JsonObject> response) {
//통신성공 시
JsonObject jsonObject = response.body();
//Json 파싱 후 사용
}
@Override
public void onFailure(Throwable t) {
//통신 실패 시
}
});
//use beans
Call<AuthModel> AuthObjectCall = sample_RestfulAdapter.getInstance().Auth();
AuthObjectCall.enqueue(new Callback<AuthModel>() {
@Override
public void onResponse(Response<AuthModel> response) {
AuthModel authModel = response.body();
authModel.getEmail();
}
@Override
public void onFailure(Throwable t) {
}
});
//use Rxandroid with Lambda
df_RestfulAdapter.getInstance().Project()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(jsonObject -> {});
view rawcall retrofit hosted with ❤ by GitHub






반응형