Ngày càng có nhiều ứng dụng hay độc đáo đáp ứng nhu cầu ngày càng cao của người dùng khó tính. Để đa dạng trong ứng dụng, bạn không thể bỏ qua việc cập nhật dữ liệu liên tục. Để làm được điều này thì dĩ nhiên ứng dụng của bạn phải kết nối internet. Bài viết sau đây sẽ giới thiệu cách kết nối dữ liệu tới server sử dụng thư viện Retrofit trong Android đơn giản và nhanh chóng.
Nội dung chính của bài viết
REST API là gì?
Android là ứng dụng phổ biến nhất trên thế giới hiện nay với hàng triệu người dùng đồng nghĩa đây là mảnh đất màu mở cho các nhà phát triển ứng dụng dựa trên nền tảng này. Đầu tiên chúng ta cùng xem qua REST API là gì? Tại sao nó lại quan trọng trong việc kết nối dữ liệu giữa ứng dụng và server?
Đối với dữ liệu việc THÊM, XOÁ, SỬA các tài nguyên là rất phổ biến mà hầu hết các ứng dụng đều sử dụng.
Nếu mỗi lập trình viên lại có cách xử lý khác nhau sẽ rất khó khăn trong việc maintaince và phát triển dự án.
Vì thế mà cộng đồng đã thống nhất một chuẩn chung để quản lý gồm có các phương thức sau đây:
- POST: định nghĩa các request mà kết quả của nó mang ý nghĩa tạo mới, chỉnh sửa dữ liệu, thay đổi so với trước khi request được thực thi.
- GET: lấy dữ liệu từ server về mang ý nghĩa kết quả sẽ không thay đổi.
- DELETE: xoá 1 dữ liệu trong hệ thống.
- PUT: mang ý nghĩa chỉnh sửa, cập nhật 1 dữ liệu nào đó trong hệ thống.
Ngoài ra còn 1 số phương thức khác chúng ta sẽ tìm hiểu ở 1 bài viết cụ thể khác. Trong quá trình sàng lọc và feedback từ những lập trình viên chuyên nghiệp, REST dần trở nên là chuẩn thiết kế API cho các dịch vụ web trên internet.
Xem chi tiết hơn về REST là gì?
Retrofit trong Android: Thư viện kết nối dữ liệu mạnh mẽ
Như đã nói ở trên, để kết nối dữ liệu tới server cần thông qua REST API, Retrofit sẽ giúp bạn giải quyết một cách hiệu quả.
Retrofit được giới thiệu bởi Square như là một http-client và được cộng đồng phát triển android sử dụng rộng rãi.
Để hiểu hơn chúng ta bắt đầu tích hợp nó vào ứng dụng của mình.
- Dành cho bạn: Top 4 thư viện Image Loading Android tốt nhất
Thực hành sử dụng Retrofit trong Android
#1. Tạo một project mới cho Retrofit trong Android
Các bạn sử dụng Adnroid Studio làm như sau: FILE → NEW PROJECT → EMPTY ACTIVITY
#2. Tải và cài đặt retrofit
Cách 1: Tải file jar thư viện retrofit tại đây.
Sau đó copy vào thư mục lib của dự án.
Cách 2: Khai báo Maven.
<dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>retrofit</artifactId> <version>2.5.0</version> </dependency>
Cách 3: Khai báo Gradle
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
Yêu cầu phiên bản Java 7 và android 2.3 trở lên. Nếu bạn sử dụng R8 hoặc Proguard thì cài đặt thêm như hướng dẫn ở đây.
Lưu ý: Để hiệu quả hơn trong việc lập trình, mình giới thiệu thêm 1 số thư viện hỗ trợ cho Retrofit, chọn 1 trong các gói sau theo nhu cầu (theo mình thì dùng GSON là đáp ứng đủ nhu cầu)
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
Và giờ gradle file sẽ như sau:
retrofitVersion = 2.5.0 // Network & Retrofit implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion" implementation("com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion") { exclude group: 'com.squareup.retrofit2', module: 'retrofit' }
#3. Thêm cài đặt quyền truy cập internet
Để ứng dụng có thể kết nối được internet thì cần phải khai báo internet permission trong manifest.xml
Vì đây là permission thuộc nhóm normal permission, nên bạn chỉ cần khai báo trong manifest là đủ, không cần phải yêu cầu người dùng chấp thuận.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.vntalking.androidretrofitl"> <!--Internet Permission--> <uses-permission android:name="android.permission.INTERNET" />
#4. Chuẩn bị công cụ để bắt đầu xây dựng ứng dụng
Để cài đặt Retrofit trong Android chúng ta cần xác định 3 điều sau đây:
- domain của bạn là gì, ví dụ: stackexchange.com
- Endpoint api, ví dụ: v1/user
- Cấu trúc dữ liệu trả về JSON (mình đề xuất dùng kiểu này vì nó trực quan và rất dễ sử dụng nhưng nếu bạn quen với cấu trúc nào thì có thể sử dụng).
Đây là một ví dụ về Json mà mình sử dụng trong ứng dụng của bài viết này:
{ "status": 1, "msg": "Success", "data": { "_id": "5c4fced93179475d41f79e59", "updated_at": 1549504468, "created_at": 1549504468, "username": “admin”, "token": "token" } }
Định nghĩa class để chứa dữ liệu, 1 cách nhanh nhất là dựa vào cấu trúc data trả về( hay chính xác hơn là cấu trúc JSON trả về):
public final class User { @SerializedName("_id") private String id; @SerializedName("token") private String token; @SerializedName("updated_at") private String updated_at; @SerializedName("created_at") private String created_at; @SerializedName("username") private String username; }
SerializedName để mapping tên biến theo cấu trúc data trả về. Đây là một hàm được hỗ trợ bởi Gson dùng chuyển đổi JSON sang các đối tượng Java và ngược lại.
#5. Định nghĩa Retrofit Client
public final class NetworkProvider { private static volatile NetworkProvider mInstance = null; private Retrofit retrofit; private NetworkProvider() { retrofit = new Retrofit.Builder() .baseUrl(“api.stackexchange.com”) .client(“new OkHttpClient.Builder().build()) .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create())) .build(); } public static NetworkProvider self() { if (mInstance == null) mInstance = new NetworkProvider(); return mInstance; } }
#6. Định nghĩa API Interface
Ví dụ: định nghĩa cho API Login với params truyền vào là username và password theo kiểu là POST và kiểu mã hoá là FormUrlEncode thì làm như sau:
public interface APIService { @POST("/v1/user") @FormUrlEncoded Call<User> login(@Field("username") String username, @Field("password") String password); }
Giải thích các thông tin trong đoạn code trên:
@FormUrlEncode: đều này chỉ ra rằng MIME được hiểu là application/x-www-form-urlendcoded
@Field: tên field, sau đó sẽ được chuyển sang string, nếu null thì retrofit sẽ bỏ qua và không gửi đi.
@POST: phương thức thực hiện request.
#7. Thực hiện request
APIService apiService = retrofit.create(APIService.class); apiService.login(username, password) .enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { //TODO Xử ký dữ liệu trả về } @Override public void onFailure(Call<User> call, Throwable t) { //TODO Xử lý lỗi } });
Trong đó:
- Enqueue: phương thức thực hiện request bất đồng bộ và thông báo cho ứng dụng khi có phản hồi từ server. Retrofit xử lý các request ở một thread riêng, để đảm bảo ứng dụng không bị treo xử lý các kết nối cần nhiều thời gian.
Tổng kết
Như vậy, mình đã hướng dẫn các bạn cách sử dụng thư viện Retrofit trong Android để kết nối ứng dụng Android tới Server. Thông qua thư viện Retrofit, mọi việc xử lý kết nối đã được thư viện làm sẵn, công việc của bạn chỉ còn là xử lý kết quả nhận từ server mà thôi. Rất tiện lợi phải không?
Các bạn có thể download toàn bộ source code của bài viết tại đây:
Ứng dụng của bạn có sử dụng thư viện Retrofit trong Android không? Hãy để lại cảm nhận của bạn về thư viện Retrofit trong Android này nhé.
không thể làm theo bài viết, lỗi nhiều quá. Cái class: public final class NetworkProvider rất nhiều lỗi. Không thể build dc
Ví dụ như: APIService apiService = retrofit.create(APIService.class);
retrofit là cái gì, nó báo lỗi. hic
Bạn có download thử mã nguồn mà mình để trên bài viết không? Mỗi đoạn code chỉ minh họa, mình không thể copy toàn bộ các đoạn mã lên bài viết để complie không bị lỗi. Bạn muốn kiểm trả code có chạy không thì cần tải full source code về và chạy thử
Đã download về và test thử, vẫn lỗi nhé chủ thớt :((( , nhờ chủ thớt xem lại
Trong cái đoạn request này:
public void onResponse(Call call, Response response) {
//TODO Xử ký dữ liệu trả về
}
Mình muốn lấy từng biến: id,. token, updated_at,… thì làm sao hả bạn. Nhờ bạn hỗ trợ giúp.
Chào bạn Thoa
Đối tượng response trả về đã có các thông tin mà bạn cần, bạn chỉ cần đọc chúng từ response là được (thường nó là JSON object). Mẹo: bạn có thể Log đối tượng response trả xem bên trong có gì, cấu trúc như nào để từ đó parse nó ra
có dùng luôn mà cũng không được. Không hiểu sao. Nhờ chủ thớt test lại giúp
có dùng thư viện: OkHttp nhưng sao không thấy khai báo vậy chủ thớt
Thư viện OkHttp nằm trong Retrofit luôn mà bạn.
bài viết hay quá
Mình cũng đang viết về Retrofit + ok http ở đây, mong dk trao đổi vs các bạn:
https://viblo.asia/p/retrofit-va-ok-http-trong-android-3Q75wG9D5Wb