Cách dụng Retrofit trong Android
Việc tiến hành Response và xử lý những dữ liệu trả về trong Android đôi khi phức tạp và khiến code trở nên rắc rối khó đọc. Để giải quyết vấn đền này 1 số thư viện ra đời Retrofit là một ví dụ. Vậy là Retrofit là gì chúng ta cùng tìm hiểu nó nhé. REST API Đối với một trang web thông thường việc tạo ra (creat), sửa (edit), cập nhật (update) và xóa (delete) taì nguyên (resource) là việc thường xuyên và phổ biến với hầu hết các trang Web nên người ta đã chế ra một một quy luật thống nhất để tất cả các lập trình viên cứ thế mà làm theo mỗi lần phải lập trình một trang có 4 chức năng trên:
Và như vậy REST API ra đời, một tiêu chuẩn dùng trong việc thết kế các thiết kế API cho các ứng dụng web để quản lý các resource. REST là một trong những kiểu thiết kế API được sử dụng phổ biến nhất ngày nay. Trọng tâm của REST quy định cách sử dụng các HTTP method (như GET,POST,PUT,DELETE...) và cách định dạng các URL cho ứng dụng web để quản các resource RetrofitRetrofit là một thư viện giúp phân tích cú pháp phản hồi API dễ dàng và được xử lý tốt hơn để sử dụng trong ứng dụng. Theo định nghĩa của Square( nhà phát triển Retrofit): A type-safe HTTP client for Android and Java Retrofit là một type-safe HTTP client cho Java và Android được phát triển bởi Square. Retrofit giúp dễ dàng kết nối đến một dịch vụ REST trên web bằng cách chyển đổi API thành Java Interface. Type-safe một ví dụ đơn giản là trình biên dịch sẽ xác nhận hợp lệ các kiểu dữ liệu trong khi biên dịch và ném một lỗi nếu bạn cố gán kiểu sai cho một biến. Thư viện mạnh mẽ này giúp bạn dễ dàng xử lý dữ liệu JSON hoặc XML sau đó phân tích cú pháp thành Plain Old Java Objects (POJOs). Tất cả các yêu cầu GET, POST, PUT, PATCH, và DELETE đều có thể được thực thi. Giống như hầu hết các phần mềm mã nguồn mở khác, Retrofit được xây dựng dựa trên một số thư viện mạnh mẽ và công cụ khác. Đằng sau nó, Retrofit làm cho việc sử dụng OkHttp để xử lý các yêu cầu trên mạng. Ngoài ra, từ Retrofit2 không tích hợp bất kỳ một bộ chuyển đổi JSON nào để phân tích từ JSON thành các đối tượng Java. Thay vào đó nó đi kèm với các thư viện chuyển đổi JSON sau đây để xử lý điều đó:
Để sử dụng Retrofit2 ta 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 AnnotationsSử dụng Annotations để mô tả yêu cầu HTTP: Hỗ trợ tham số URL và tham số truy vấn Chuyển đổi đối tượng để yêu cầu nội dung Multipart request body và file upload public interface StackOverflowApi { @GET("/2.2/questions?order=desc&sort=creation&site=stackoverflow&tagged={tag}") ObservableAnnotation trên các phương thức của interface và các tham số của nó cho biết cách xử lý yêu cầu REQUEST METHOD Mỗi phương thức phải có Annotation HTTP cung cấp request method và URL. Có năm Annotation được tích hợp sẵn: @GET, @POST, @PUT, @DELETE và @HEAD URL tương đối của tài nguyên được chỉ định trong Annotation. URL request có thể được cập nhật tự động bằng cách sử dụng các khối thay thế và tham số trên phương thức. Chúng ta có thể sử dụng URL 1 cách động dựa vào biến truyền vào, bằng cách sử dụng anotation @Path @GET("group/{id}/users") Call
Chúng ta có thể nối thêm paramater vào sau URL bằng cách sử dụng @Query @GET("group/{id}/users") Call
Một đối tượng có thể được chỉ định để sử dụng làm phần thân yêu cầu HTTP với Annotation @Body. @POST("users/new") CallĐối tượng cũng sẽ được chuyển đổi bằng cách sử dụng Converter được chỉ định trên instance của Retrofit. Nếu không có Converter nào được thêm vào, chỉ có thể sử dụng RequestBody. FORM ENCODED AND MULTIPARTCác phương thức cũng có thể được khai báo để gửi dữ liệu được mã hóa và dữ liệu multipart(nhiều phần). Dữ liệu được mã hóa theo form được gửi khi @FormUrlEncoded được chỉ định trên phương thức. Mỗi cặp key-value được chú thích bằng @Field chứa tên và đối tượng cung cấp giá trị. @FormUrlEncoded @POST("user/edit") CallCá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. Chú thích:
CONVERTERSMặc định Retrofit chỉ có thể deserialize phần thân bản tin HTTP thành kiểu OkHttp's ResponseBody Và nó chỉ chấp nhận kiểu RequetsBody cho Annotation @Body. Converter có thể được thêm vào để hỗ trợ các loại khác: GSON: com.squareup.retrofit2:converter-gson Gson là một thư viện Java có thể được sử dụng để chuyển đổi các đối tượng Java thành biểu diễn JSON của chúng. Nó cũng có thể được sử 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 cần thiết cho Gson để ánh xạ các khoá JSON với các trường dữ liệu. Để phù 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 nên 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 nên được định nghĩa với JSON serialization hoặc deserialization. Tạo instance RetrofitVí dụ: Tạo interface cho API từ stackoverflow.com lấy danh sách bài đăng thuộc tag "Android" : public interface StackOverflowApi { @GET("/2.2/questions?order=desc&sort=creation&site=stackoverflow&tagged={tag}") CallTạo instance của Retrofit2 : Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.stackexchange.com") .addConverterFactory(GsonConverterFactory.create(gson))Thực hiện Request đến API và xử lý kết quả trả về : StackOverflowApi stackOverflowApi = retrofit.create(StackOverflowApi.class); stackOverflowApi.loadQuestion("android") .enqueue(new Callback |