Retrofit là thuật ngữ được thường xuyên nhắc đến trong cộng đồng các Android Developer bởi những ưu điểm mà nó mang lại. Tuy nhiên, đối với những ai không thuộc chuyên ngành này sẽ cảm thấy khái niệm này xa lạ. Vậy là Retrofit trong Android là gì? Các bạn hãy cùng Tino Group tìm hiểu chi tiết hơn qua bài viết dưới đây nhé!
Retrofit là gì?
Định nghĩa Retrofit
Retrofit được định nghĩa là một type-safe HTTP client cho Java, Android và Kotlin do công ty Square phát triển. Retrofit hỗ trợ cho các nhà lập trình chuyển đổi API thành Java Interface để dễ dàng kết nối đến một dịch vụ REST trên web.
Retrofit là một trong những thư viện Rest-Client được sử dụng phổ biến hiện nay trong việc hỗ trợ giao tiếp giữa client và server trở lên thuận tiện hơn. Thư viện này rất mạnh mẽ cho phép bạn dễ dàng xử lý dữ liệu JSON hoặc XML và sau đó sẽ phân tích cú pháp thành Plain Old Java Objects (POJOs). Tại đây, hầu hết các yêu cầu như GET, POST, PUT, PATCH, và DELETE đều có thể được thực hiện.
Tương tự như các phần mềm mã nguồn mở khác, Retrofit được xây dựng dựa trên các thư viện và công cụ mạnh mẽ. Retrofit làm cho việc sử dụng OkHttp trở nên đơn giản để xử lý các yêu cầu trên mạng. Bên cạnh đó, kể từ Retrofit2 sẽ không tích hợp với bất kỳ một bộ chuyển đổi JSON nào để phân tích JSON thành các đối tượng Java. Để xử lý điều đó, Retrofit sẽ đi kèm với các thư viện chuyển đổi JSON sau đây:
- Gson: com.squareup.retrofit:converter-gson
- Jackson: com.squareup.retrofit:converter-jackson
- Moshi: com.squareup.retrofit:converter-moshi
REST API là gì?
REST là viết tắt của cụm từ Representational State Transfer, được ra đời vào năm 2000 trong bài luận văn tiến sĩ của Roy Thomas Fielding (người đồng sáng lập giao thức HTTP). Đây là một dạng chuyển đổi cấu trúc dữ liệu và là một phong cách kiến trúc cho việc thiết kế các ứng dụng có kết nối. REST sẽ sử dụng HTTP đơn giản để tạo ra giao tiếp giữa các máy. Vì vậy, thay vì sử dụng một URL cho việc xử lý các thông tin người dùng, REST sẽ tiến hành gửi một yêu cầu HTTP như GET, POST, DELETE,…đến một URL và xử lý dữ liệu tại đó.
API là viết tắt của cụm từ Application Programming Interface, là một giao diện lập trình ứng dụng giúp tạo ra các phương thức kết nối đến các thư viện và những ứng dụng khác nhau.
Tóm lại, REST API là một ứng dụng chuyển đổi cấu trúc dữ liệu có phương thức để kết nối với các thư viện hoặc những ứng dụng khác. REST API không được xem là một dạng công nghệ mà đây là một giải pháp để tạo ra các ứng dụng web services thay thế cho các dạng khác như SOAP, WSDL,…
Hướng dẫn cách sử dụng Retrofit trong Android
Để sử dụng Retrofit bạn cần thêm dependency vào trong file build.gradle :
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Retrofit Annotations
Bạn sẽ sử dụng Annotations để mô tả yêu cầu HTTP:
- Hỗ trợ các tham số URL và tham số truy vấn
- Chuyển đổi đối tượng để mới có thể yêu cầu nội dung
- Multipart request body và tệp tải lên
public interface StackOverflowApi {
@GET("/2.2/questions?order=desc&sort=creation&site=stackoverflow&tagged={tag}")
Observable<StackOverflowQuestion> loadQuestion(@Path("tag") String tag);
}
Annotation trên các phương thức của interface và các tham số của nó sẽ cho biết cách xử lý yêu cầu.
Request Method
Mỗi phương thức cần phải có Annotation HTTP cung cấp các request method và URL. Có năm Annotation được tích hợp sẵn bao gồm: @GET, @POST, @PUT, @DELETE và @HEAD URL tương đối của tài nguyên đã được chỉ định trong Annotation.
@GET("users/list")
Bạn cũng có thể chỉ định tham số truy vấn trong URL như sau:
@GET("users/list?sort=desc")
URL Manipulation
URL request có thể được tự động cập nhật bằng cách sử dụng các khối thay thế và các tham số trên phương thức.
Bạn có thể sử dụng URL một cách tự động dựa trên các biến truyền vào, bằng cách sử dụng annotation @Path với lệnh dưới đây:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
Bạn cũng có thể nối thêm parameter vào sau URL bằng cách sử dụng annotation @Query với lệnh dưới đây:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
Bạn có thể sử dụng @QueryMap đối với một số kết hợp tham số truy vấn phức tạp bằng lệnh dưới đây:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
Request Body
Một đối tượng có thể được chỉ định làm phần thân yêu cầu HTTP với Annotation @Body.
@POST("users/new")
Call<User> createUser(@Body User user);
Đối tượng còn có thể được chuyển đổi bằng cách sử dụng Converter được chỉ định sẵn trên instance của Retrofit. Còn nếu không có Converter nào được thêm vào, bạn chỉ có thể sử dụng RequestBody.
Form Encoded và Multipart
Các phương thức cũng có thể khai báo để gửi dữ liệu được mã hóa và dữ liệu multipart. Dữ liệu đã được mã hóa theo form sẽ gửi khi @FormUrlEncoded được chỉ định trên phương thức. Mỗi cặp key-value sẽ được chú thích bằng @Field có chứa tên và đối tượng cung cấp giá trị.
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
Trong khi đó, các yêu cầu multipart sẽ được sử dụng khi @Multipart xuất hiện trên phương thức. Các phần sẽ được khai báo bằng cách sử dụng @Part
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
Các phần của multiparts sử dụng một trong các bộ chuyển đổi của Retrofit hoặc chúng có thể implement RequestBody để xử lý serialization của riêng chúng.
Converters
Retrofit được mặc định chỉ có thể deserialize phần thân bản tin HTTP thành kiểu OkHttp’s ResponseBody và chỉ chấp nhận kiểu RequetsBody cho Annotation @Body.
Converter cũng có thể được thêm vào để hỗ trợ các loại khác:
GSON: com.squareup.retrofit2:converter-gson
Gson được định nghĩa là một thư viện Java dùng để chuyển đổi các đối tượng Java thành biểu diễn JSON của chúng. Ngược lại, Gson cũng có thể dùng để chuyển đổi một chuỗi JSON thành một đối tượng Java tương đương.
public class Question {
@SerializedName("title")
@Expose
private String mTitle;
@SerializedName("link")
@Expose
private String mLink;
public String toString() {
return mTitle;
}
}
@SerializedName rất cần thiết cho Gson để ánh xạ các khóa JSON với các trường dữ liệu. Để thích hợp với quy ước đặt tên kiểu camelCase của Java cho các thuộc tính thành viên của lớp, bạn không được sử dụng dấu gạch dưới để tách các từ ngữ trong một biến.
@Expose chỉ ra rằng trường này cần được định nghĩa với JSON serialization hoặc deserialization.
Tạo instance Retrofit
Ví dụ: Bạn có thể tạo tạo interface cho API từ stackoverflow để lấy danh sách bài đăng thuộc tag “Android” bằng lệnh :
public interface StackOverflowApi {
@GET("/2.2/questions?order=desc&sort=creation&site=stackoverflow&tagged={tag}")
Call<StackOverflowQuestion> loadQuestion(@Path("tag") String tag);
}
Tạo instance với Retrofit2 :
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.stackexchange.com")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
Tiến hành Request đến API và xử lý kết quả trả về :
StackOverflowApi stackOverflowApi = retrofit.create(StackOverflowApi.class);
stackOverflowApi.loadQuestion("android")
.enqueue(new Callback<StackOverflowQuestion>() {
@Override
public void onResponse(Call<StackOverflowQuestion> call, Response<StackOverflowQuestion> response) {
//TODO Xử lý dữ liệu trả về
}
@Override
public void onFailure(Call<StackOverflowQuestion> call, Throwable t) {
//TODO Xử lý lỗi
}
});
Sử dụng Retrofit chuyên nghiệp sẽ giúp bạn thực hiện các request một cách dễ dàng. Trên đây là những thông tin cơ bản về Retrofit trong Android, hy vọng đây sẽ là một kiến thức mới cho những ai đang theo đuổi ngành lập trình.
FAQs về Retrofit
Tại sao nên dùng Retrofit?
Retrofit là một thư viện được tổ chức rất tốt, có tài liệu hướng đầy đủ và khi sử dụng sẽ giúp bạn tiết kiệm rất nhiều thời gian để xử lý các vấn đề không cần thiết. Bên cạnh đó, sử dụng Retrofit sẽ nhanh hơn rất nhiều so với việc sử dụng Volley, AsyncTask
Type-Safe là gì?
Type-Safe là một trình biên dịch dùng để xác nhận các kiểu trong khi biên dịch và sẽ xuất hiện lỗi nếu bạn cố gắng gán sai kiểu cho một biến. Type-Safe sẽ không thể thực hiện một thao tác trên một đối tượng không hợp lệ.
Annotation là gì?
Annotation được định nghĩa là một dạng chú thích hoặc một dạng siêu dữ liệu (metadata) được dùng để cung cấp các thông tin dữ liệu cho mã nguồn Java. Các chú thích sẽ không có ảnh hưởng trực tiếp đến những hoạt động của mã mà chúng đang chú thích. Annotation được thêm vào từ Java 5.
Các Annotation có trong mã nguồn sẽ được biên dịch thành dạng bytecode và sử dụng một kỹ thuật gọi là phản chiếu (Reflection) để truy vấn thông tin siêu dữ liệu, đồng thời sẽ đưa ra những hành động thích hợp. Chúng ta có thể chú thích cho các lớp (class), các biến (variable), phương thức (method), các gói (package) và các tham số (parameter) trong thư viện Java.
Serialization là gì?
Trong Java, Serialization là cơ chế dùng để chuyển đổi trạng thái của một đối tượng (giá trị các thuộc tính trong object) thành một chuỗi byte và chuỗi byte này cũng có thể chuyển đổi ngược lại thành một đối tượng. Quá trình chuyển đổi chuỗi byte thành đối tượng còn gọi là deserialization..
Thông thường, khi sử dụng Serialization, Java object sẽ được chuyển đổi qua một dãy byte liên tục và chúng ta có thể lưu chúng trong bộ nhớ, trên ổ đĩa, truyền qua mạng đến một server nào đó hoặc cũng có thể lưu chúng vào database.
Và khi có một tiến trình khác sử dụng Java object đã được Serialization, tiến trình đó sẽ được chuyển đổi định dạng sau khi Serialization trở về trạng thái của Java object ban đầu.