Retrofit 2.0 구성 편
인스턴스 가져오기
OkHttpClient.Builder
객체 가져오기:OkHttpClient.Builder builder = new OkHttpClient.Builder();
Log 정보 차단기
Debug
모드에서 네트워크 요청, 인쇄Log
정보를 볼 수 있으며 발표할 때 필요없다Log
.의존성 추가
항목
build.gradle
추가:compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
차단기 설정
if(BuildConfig.DEBUG){
//Log
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// Log
builder.addInterceptor(loggingInterceptor);
}
캐시 메커니즘
네트워크가 없을 때도 데이터를 표시할 수 있다.
File cacheFile = new File(MyApplication.getContext().getExternalCacheDir(), "DemoCache");
Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);
Interceptor cacheInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!AppUtils.networkIsAvailable(MyApplication.getContext())) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
if (AppUtils.networkIsAvailable(MyApplication.getContext())) {
int maxAge = 0;
// 0
response.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)
.removeHeader("Demo")// , , ,
.build();
} else {
// , 4
int maxStale = 60 * 60 * 24 * 28;
response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.removeHeader("nyn")
.build();
}
return response;
}
};
builder.cache(cache).addInterceptor(cacheInterceptor);
공통 매개 변수
Interceptor addQueryParameterInterceptor = new Interceptor(){
@Override
public Response intercept(Chain chain) throws IOException{
Request originalRequest = chain.request();
Request request;
String method = originalRequest.method();
Headers headers = originalRequest.headers();
HttpUrl modifiedUrl = originalRequest.url().newBuilder()
// Provide your custom parameter here
.addQueryParameter("platform", "android")
.addQueryParameter("version", "1.0.0")
.build();
request = originalRequest.newBuilder().url(modifiedUrl).build();
return chain.proceed(request);
}
};
builder.addInterceptor(addQueryParameterInterceptor);
요청 헤더
다음은 초기 설정 방식에 요청 헤더를 추가하고, 다른 하나는 인터페이스 방식을 정의하는 것입니다. 주석편
@Headers
을 보십시오.Interceptor headerInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder requestBuilder = originalRequest.newBuilder()
.header("AppType", "TPOS")
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.method(originalRequest.method(), originalRequest.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
};
builder.addInterceptor(headerInterceptor );
cookie
서비스 측에서 요청을 동일하게 유지해야 할 수도 있습니다.
cookie
수요를 보십시오.의존성 추가
항목
build.gradle
추가:compile 'com.squareup.okhttp3:okhttp-urlconnection:3.2.0'
쿠키 설정
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
builder.cookieJar(new JavaNetCookieJar(cookieManager));
시간 초과, 재연결
//
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//
builder.retryOnConnectionFailure(true);
Retrofit 설정
OkHttpClient okHttpClient = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiStores.API_SERVER_URL)
// Json
.addConverterFactory(GsonConverterFactory.create())
//RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
Json 변환기
기본값
Retrofit
은 반서열화Http bodies
OkHttp
만 ResponseBody
할 수 있고 @Body
만 받아들일 수 있습니다.Retrofit 2.0
응답 데이터를 분석하는 다양한 방법을 지원합니다.com.squareup.retrofit2:converter-gson
com.squareup.retrofit2:converter-jackson
com.squareup.retrofit2:converter-moshi
com.squareup.retrofit2:converter-protobuf
com.squareup.retrofit2:converter-wire
com.squareup.retrofit2:converter-simplexml
com.squareup.retrofit2:converter-scalars
사용자 정의 동글 상속
Converter.Factory class
http://simple.sourceforge.net/Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.nuuneoi.com/base/")
.addConverterFactory(GsonConverterFactory.create())
.build();
RxJava
제공
Callback
형식API
뿐만 아니라RxJava
버전Observable
형식API
도 있다.의존성 추가
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta3'
compile 'io.reactivex:rxandroid:1.0.1'
설정
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.nuuneoi.com/base/")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
밤1:
User
대상의 인터페이스 가져오기Callback 방식:
//
@GET("/user")
public void getUser(@Query("userId") String userId, Callback callback);
//
getUser(userId, new Callback() {
@Override
public void success(User user) {
userView.setUser(user);
}
@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};
Rxjava 방식:
//
@GET("/user")
public Observable getUser(@Query("userId") String userId);
//
getUser(userId)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onNext(User user) {
userView.setUser(user);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable error) {
// Error handling
...
}
});
밤2: 획득한 User는 직접 표시하지 않으며, 먼저 데이터베이스에 있는 데이터와 비교하여 수정한 후에 표시한다
Callback 방식:
getUser(userId, new Callback() {
@Override
public void success(User user) {
processUser(user); // User
userView.setUser(user);
}
@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};
주의: 데이터베이스 조작은 시간 소모 조작에 속하기 때문에 주 라인에서 데이터베이스를 조작하는 것을 피해야 한다.
//
getUser(userId, new Callback() {
@Override
public void success(User user) {
new Thread() {
@Override
public void run() {
processUser(user); // User
runOnUiThread(new Runnable() { // UI
@Override
public void run() {
userView.setUser(user);
}
});
}
}).start();
}
@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};
Rxjava 방식:
getUser(userId)
.doOnNext(new Action1() {
@Override
public void call(User user) {
processUser(user);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onNext(User user) {
userView.setUser(user);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable error) {
// Error handling
...
}
});
밤3:
/user
인터페이스는 직접 접근할 수 없으며 온라인으로 가져와야 한다token
Callback 방식: 중첩 가능Callback
@GET("/token")
public void getToken(Callback callback);
@GET("/user")
public void getUser(@Query("token") String token, @Query("userId") String userId, Callback callback);
...
getToken(new Callback() {
@Override
public void success(String token) {
getUser(token, userId, new Callback() {
@Override
public void success(User user) {
userView.setUser(user);
}
@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};
}
@Override
public void failure(RetrofitError error) {
// Error handling
...
}
});
Rxjava 방식:
@GET("/token")
public Observable getToken();
@GET("/user")
public Observable getUser(@Query("token") String token, @Query("userId") String userId);
...
getToken()
.flatMap(new Func1>() {
@Override
public Observable onNext(String token) {
return getUser(token, userId);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onNext(User user) {
userView.setUser(user);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable error) {
// Error handling
...
}
});
전체 구성
public class AppClient {
public static Retrofit retrofit = null;
public static Retrofit retrofit() {
if (retrofit == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
/**
*
*/
/**
*
*/
/**
*
*/
/**
* Log
*/
/**
* cookie
*/
/**
*
*/
//
OkHttpClient okHttpClient = builder.build();
retrofit = new Retrofit.Builder()
.baseUrl(ApiStores.API_SERVER_URL)
// Json
.addConverterFactory(GsonConverterFactory.create())
//RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
}
구성 혼동
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on RoboVM on iOS. Will not be used at runtime.
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.