Kết nối rest API bằng Retrofit trong Android

10
Dịch vụ dạy kèm gia sư lập trình

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.

Kết nối rest API bằng Retrofit trong Android

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.

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:

  1. domain của bạn là gì, ví dụ: stackexchange.com
  2. Endpoint api, ví dụ: v1/user
  3. 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é.

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcHướng dẫn tạo Custom View trong Android cơ bản
Bài tiếp theoLàm thế nào để tăng lượng tải app sau mỗi lượt view
Sơn Dương
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

10
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Thoa
Guest
Thoa

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

Thoa
Guest
Thoa

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.

Thoa
Guest
Thoa

có dùng thư viện: OkHttp nhưng sao không thấy khai báo vậy chủ thớt

Thoa
Guest
Thoa

bài viết hay quá

Trung
Guest
Trung

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