retrofit là gì

Retrofit là gì?

Được cải tiến và phát triển vị Square

Retrofit là 1 trong HTTP client type-safe cho tới Android và Java. Retrofit canh ty đơn giản dễ dàng liên kết cho tới một cty REST bên trên trang web bằng phương pháp chyển thay đổi API trở thành Java Interface.

Bạn đang xem: retrofit là gì

Retrofit cực kỳ uy lực khiến cho bạn đơn giản dễ dàng xử lý tài liệu JSON hoặc XML tiếp sau đó phân tách cú pháp trở thành Plain Old Java Objects (POJOs). Tất cả những đòi hỏi GET, POST, PUT, PATCH, và DELETE đều hoàn toàn có thể được thực ganh đua.

Giống như đa số những ứng dụng mã mối cung cấp banh không giống, Retrofit được thi công dựa vào một trong những tủ sách uy lực và khí cụ không giống. Đằng sau nó, Retrofit thực hiện cho tới việc dùng OkHttp (từ và một ngôi nhà trị triển) nhằm xử lý những đòi hỏi bên trên mạng. Trong khi, Retrofit ko tích hợp ý ngẫu nhiên một cỗ quy đổi JSON này nhằm phân tách kể từ JSON trở thành những đối tượng người tiêu dùng Java. Thay vô ê nó kèm theo với những tủ sách quy đổi JSON tại đây nhằm xử lý điều đó

Cách người sử dụng Retrofit

Để thao tác làm việc với Retrofit bạn phải thực hiện cơ bạn dạng 3 lớp:

  • Model class nhằm ánh xạ với JSON data.
  • Một interface dùng làm khái niệm những hàm và cách thức HTTP
  • Retrofit.Builder Lớp nhằm khái niệm URL Endpoint cho những sinh hoạt tương quan cho tới HTTP

APIDeclaration

Annotations vô interface và những thông số của bọn chúng đã cho thấy cơ hội tuy nhiên request được thực hiện

Request Method

Mỗi method nên sở hữu một HTTP annotation. Có 5 annotations GET, POST, PUT, DELETE, and HEAD Bên trong những annotation là 1 trong đoạn của URL.

@GET("users/list")

Bạn cũng hoàn toàn có thể hướng dẫn và chỉ định thông số truy vấn vô URL

@GET("users/list?sort=desc")

URL MANIPULATION

Dưới đấy là ví dụ của interface dùng làm khái niệm những http request

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

Khối {user] trong khúc bên trên được thay cho thế bươi thông số user vô hàm listRepos. phẳng việc dùng anotation @Path và truyền vô nằm trong chuỗi string vô khối {}

Tham số query cũng hoàn toàn có thể add thêm thắt được như sau:

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

Nếu tuy nhiên thông số query phức tạp hoàn toàn có thể sự dụng Map:

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

Request Body

Một đối tượng người tiêu dùng hoàn toàn có thể được hướng dẫn và chỉ định cho tới mục tiêu dùng thực hiện phần body toàn thân cho tới truy vấn với @Body annotation

@POST("users/new")
Call<User> createUser(@Body User user);

Đối tượng cũng sẽ tiến hành quy đổi bằng phương pháp dùng trình quy đổi được hướng dẫn và chỉ định vô Retrofit instance. Nếu không tồn tại trình quy đổi này được thêm nữa, chỉ hoàn toàn có thể dùng RequestBody.

Form Encoded and multipart

Các cách thức cũng hoàn toàn có thể được khai báo nhằm gửi tài liệu được mã hóa theo đòi kiểu mẫu và nhiều phần. Dữ liệu được mã hóa biểu kiểu mẫu được gửi khi sở hữu annotation @FormUrlEncoding . Mỗi cặp key-value được chú quí vị @Field chứa chấp thương hiệu và đối tượng người tiêu dùng hỗ trợ độ quý hiếm.

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

Yêu cầu nhiều phần được dùng với @Multipart .Mỗi phần được khai báo bằng phương pháp dùng chú quí @Part.

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

Header manipulation

Bạn hoàn toàn có thể Header tĩnh cho tới cách thức dùng @Headers annotation.

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

Lưu ý rằng những headers ko ghi đè lên trên nhau. Tất cả những title sở hữu nằm trong thương hiệu sẽ tiến hành bao hàm vô đòi hỏi. Một title đòi hỏi hoàn toàn có thể được update động bằng phương pháp dùng chú quí @Header. Một thông số ứng nên được hỗ trợ cho tới @Header. Nếu độ quý hiếm là null, header sẽ ảnh hưởng bỏ dở. Nếu ko, toString sẽ tiến hành gọi bên trên độ quý hiếm và thành quả được dùng.

@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

Tương tự động như các thông số truy vấn, so với hearder phức tạp, hoàn toàn có thể sự dụng Map

Xem thêm: under the counter là gì

@GET("user")
Call<User> getUser(@HeaderMap Map<String, String> headers)

Header cần thiết thêm nữa từng request tuy vậy hoàn toàn có thể dùng OkHttp Interceptor để thay thế thế

Converters

Theo khoác quyết định, Retrofit chỉ hoàn toàn có thể giải tuần tự động hóa (deserialize) những HTTPbodies trở thành ResponseBody của OkHttp và nó chỉ hoàn toàn có thể gật đầu đồng ý loại RequestBody của chính nó cho tới @Body. Bộ quy đổi hoàn toàn có thể được thêm nữa nhằm tương hỗ những loại không giống. Dưới đấy là 6 tủ sách thịnh hành dùng.

  • Gson: com.squareup.retrofit:converter-gson
  • Jackson: com.squareup.retrofit:converter-jackson
  • Moshi: com.squareup.retrofit:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire Và so với XML, Retrofit hỗ trợ:
  • Simple Framework: com.squareup.retrofit2:converter-simpleframework

Caching là gì?

Caching là cơ hội tàng trữ trong thời điểm tạm thời tài liệu được tìm hiểu hấp thụ kể từ mạng bên trên bộ nhớ lưu trữ của khí giới, nhằm tất cả chúng ta hoàn toàn có thể truy vấn vô phiên sau thời điểm khí giới nước ngoài tuyến hoặc nếu như tất cả chúng ta ham muốn truy vấn lại và một tài liệu.

Nhưng trước ê, tại sao nên người sử dụng caching vô phần mềm của mình?

Lợi ích của việc Caching

  • Giảm dung nạp đường truyền.
  • Tiết kiệm cho mình thời hạn chúng ta dành riêng thời hạn chờ đón sever hỗ trợ cho mình phản hồi mạng.
  • Tiết kiệm cho tới sever trọng trách của lưu lượng bổ sung cập nhật.
  • Nếu bạn phải truy vấn lại và một khoáng sản mạng sau thời điểm đang được truy vấn mới gần đây, khí giới của người sử dụng đang được giành được Yêu cầu nên gửi đòi hỏi cho tới máy chủ; Thay vô ê, nó sẽ bị sẽ có được phản hồi tàng trữ. Vì vậy, trả quý phái phần thực hành thực tế này 😄

Tạo instance Retrofit

Khi dùng Retrofit, nằm trong vs GSON, thì Retrofit instance sẽ có được dạng thế này:

    public static Retrofit getInstance(Context context) {
        if (sRetrofit == null) {
            sRetrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return sRetrofit;
    }

Với instance phía trên tức là tớ đang được người sử dụng OkHttpClient khoác quyết định nhằm thực ganh đua requests. Điều ê ko được "thân thiện" với bộ lưu trữ cho tới lắm 😄. Chúng tớ sẽ khởi tạo rời khỏi instance của OkHttpClient nhằm cache tài liệu & xử lí dữ việc lấy tài liệu một cơ hội thuận tiện khi:

  • Thiết bị đang được offline.
  • Thiết bị cần thiết truy cập và một dữ liệu kể từ mạng internet vô một khoảng tầm thời hạn ngắn ngủn.

Tạo OkHttpClient

Tạo cách thức đánh giá liên kết internet

Trước không còn cần thiết tạo ra một cách thức nhằm đánh giá liên kết mạng internet bên trên thiết bị:

public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager
                = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

Định nghĩa một trong những thông số sở hữu sử dụng

Dưới đấy là một trong những thông số sở hữu dùng vô quy trình tạo ra OkHttpClient. Ta hầu hết quan hoài cho tới CACHE_SIZE, TIME_CACHE_ONLINE, TIME_CACHE_OFFLINE:

  • CACHE_SIZE: đã cho thấy lượng cache tiếp tục lưu là 10MB. Chú ý rằng CACHE_SIZE nên là loại long.
  • TIME_CACHE_ONLINE: nếu như sở hữu mạng internet tiếp tục lấy cache lưu 1 phút trước, nếu như vượt lên trước 1 phút sẽ không còn lấy, 'max-age' là tính chất phụ trách cứ việc này.
  • TIME_CACHE_OFFLINE: nếu như không tồn tại mạng internet tiếp tục lấy cache lưu một ngày trước đó, nếu như vượt lên trước thì ko lấy, "max-stale" là tính chất phụ trách cứ việc này, 'only-if-cached' là nhằm ko request tuy nhiên chỉ lấy cache.
    private static final long CACHE_SIZE = 10 * 1024 * 1024;
    private static final int READ_TIMEOUT = 5000;
    private static final int WRITE_TIMEOUT = 5000;
    private static final int CONNECT_TIMEOUT = 5000;
    private static String CACHE_CONTROL = "Cache-Control";
    private static final String TIME_CACHE_ONLINE = "public, max-age = 60";// 1 minute
    private static final String TIME_CACHE_OFFLINE = "public, only-if-cached, max-stale = 86400";//1 day

Nếu những mình muốn hướng dẫn thêm về max-age, max-stale và only-if-cached thì nhấp vào đây

Tạo OkHttpClient

Tạo instance của OkHttpClient với những thông số kỹ thuật đang được khai báo mặt mày trên

private static OkHttpClient initClient(final Context context) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
                .writeTimeout(WRITE_TIMEOUT, TimeUnit.MILLISECONDS)
                .connectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
                .retryOnConnectionFailure(true)
                .cache(new Cache(context.getCacheDir(), CACHE_SIZE))
                .addInterceptor(chain -> {
                    Request request = chain.request();
                    if (isNetworkAvailable(context)) {
                        request = request
                                .newBuilder()
                                .header(CACHE_CONTROL, TIME_CACHE_ONLINE)
                                .build();
                    } else {
                        request = request
                                .newBuilder()
                                .header(CACHE_CONTROL, TIME_CACHE_OFFLINE)
                                .build();
                    }
                    HttpUrl httpUrl = request.url()
                            .newBuilder()
                            .addQueryParameter(QUERRY_PARAMETER_API_KEY, API_KEY)
                            .build();
                    Request.Builder requestBuilder = request
                            .newBuilder()
                            .url(httpUrl);
                    return chain.proceed(requestBuilder.build());
                });
        return builder.build();
    }

Thêm instance OkHttpClient vừa phải tạo ra vô Retrofit

Thêm 1 loại vô cách thức getInstance của Retrofit nhằm thêm thắt OkHttpClient

 public static Retrofit getInstance(Context context) {
        if (sRetrofit == null) {
            sRetrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    //Add OkHttpClient
                    .client(initClient(context))
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return sRetrofit;
    }

Tổng kết

Tóm kiểu mẫu váy lại nội dung bài viết tôi đã trình diễn cho tới chúng ta thấy được Retrofit là gì và những dùng ra làm sao. Hình như là sự caching vs Retrofit rời khỏi làm thế nào. Nếu API tuy nhiên chúng ta đang được dùng cho tới phần mềm của tớ sở hữu số lượng giới hạn về con số request chúng ta cũng có thể triển khai, thì không những lưu vô cỗ đệm với Retrofit một kế hoạch hữu ích nhằm vận dụng tuy nhiên còn là một loại quan trọng nhằm chúng ta thao tác làm việc với API . Vì vậy, bản thân kỳ vọng nội dung bài viết hoàn toàn có thể khiến cho bạn tận dụng tối đa ưu thế của cục lưu giữ đệm với Retrofit và thực hiện cho tới phần mềm của người sử dụng awesome rộng lớn 😄

Tư liệu sử dụng:

https://medium.com/mindorks/caching-with-retrofit-store-responses-offline-71439ed32fda

Xem thêm: gopher là gì

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

https://square.github.io/okhttp/

https://square.github.io/retrofit/