출처 : 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(); |
| } |
AuthModel은 getter, setter로 이루어진 Bean객체입니다. Json의 구조와 동일하게 구현되어 있어야 자동으로 파싱이 가능합니다.
auth.json
| { "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 */ |
| ... |
| |
| } |
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; |
| } |
| } |
쿠키관리하기
JavaNetCookieJar를 사용하기 위해서는 디펜던시에 'com.squareup.okhttp3:okhttp-urlconnection:3.0.1'을 추가해야 합니다.
OkHttp3에서 달라진 쿠키스토어 사용방법은 이후에 작성된 아래 포스트를 참고해 주세요.
http://tiii.tistory.com/13
호출이 필요한 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 -> {}); |