Retrofit 2.0 구성 편

12688 단어

인스턴스 가져오기

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 bodiesOkHttpResponseBody할 수 있고 @Body만 받아들일 수 있습니다.Retrofit 2.0 응답 데이터를 분석하는 다양한 방법을 지원합니다.
  • Gson:: com.squareup.retrofit2:converter-gson
  • Jackson: com.squareup.retrofit2:converter-jackson
  • Moshi: com.squareup.retrofit2:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire
  • Simple XML: com.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

  • 사용자 정의 동글 상속Converter.Factory classhttp://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 인터페이스는 직접 접근할 수 없으며 온라인으로 가져와야 한다tokenCallback 방식: 중첩 가능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
    

    좋은 웹페이지 즐겨찾기