출처 - http://tiii.tistory.com/11
OkHttp3에서 달라진 쿠키스토어 사용방법은 이후에 작성된 아래 포스트를 참고해 주세요.
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
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 |
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
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 -> {}); |
출처: http://tiii.tistory.com/11 [안드로이드 개발 팁 블로그]
'개발 > 안드로이드' 카테고리의 다른 글
Android ConstraintLayout (0) | 2017.05.31 |
---|---|
RxJava, RxAndroid 의 활용 - 1. Retrolambda (0) | 2017.05.30 |
오픈 소스 라이브러리 쉽게 배포하기 - JitPack (0) | 2017.03.28 |
WebView Session 초기화 (0) | 2017.02.20 |
안드로이드 ContentObserver (1) | 2017.01.31 |
댓글