Retrofit - cái tên quen thuộc trong xử lý API
android
55
White

leo viết ngày 21/01/2019

Mở đầu

Retrofit là một cái tên hẳn không còn xa lạ với nhưng Java, đặc biệt là các bạn làm bên ứng dụng, đây là thư viện giúp việc giao tiếp (gửi và nhận dữ liệu) với API trở nên dễ dàng hơn. Thư viện này được tạo bởi Square, mấy bạn có thể liên trang chủ của nó: https://square.github.io/retrofit/ để đọc kỹ hơn (bạn nào chưa biết thì vào đọc cho biết, bạn nào biết rồi thì vào đọc để ôn lại nha :D)

Cách sử dụng

Để triển khai sử dụng Retrofit, chúng ta cần xây dụng 3 class cơ bản:

  • Model dùng để mapping với dữ liệu mà API trả về, để tiện thì các bạn có thể vào trang http://www.jsonschema2pojo.org/ để convert dữ liệu sang các class model
  • Interface dùng để định nghĩa các API dùng trong ứng dụng
  • Retrofit Client dùng để định nghĩa các url giao tiếp khi call API

Ví dụ

Ví dụ này mình làm trong android, server do mình tự xây chạy trên local (lý do là mình muốn demo nhiều phương thức giao tiếp với API cho mọi người dễ hình dung hơn, với lại dữ liệu nhận được thì cũng dễ kiểm chứng xem có chuẩn không đó mà :D)

Cài đặt Retrofit:

Thêm 2 implementation vào trong Gradle để import Retrofit vào trong app:
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

Xây dựng model

Ví dụ này mình dùng API đăng ký và đăng nhập nên dữ liệu mình cần là thông tin user, model dữ liệu như sau:

public class UserData {
        private String id;
        private String name;
        private String bdate;
        private String gender;
        private String email;
        private String addr;
        private String phone;
        private String pws;
}

Ngoài ra còn có một model nhận message thông báo từ server: (cái này dùng để nhận kết quả từ server, nếu có sai gì thì show message ra cho người dùng)

public class Result {
    private int result_code;
    private String message;
    private String id;
}

Xây dựng Interface giao tiếp với API:

Mình sử dụng 2 phương thức hay dùng là POST và GET, POST dùng để thực hiện đăng ký và đăng nhập còn GET mình dùng để lấy thông tin user sau khi đã đăng nhập thành công. Interface của mình như sau:

public interface RequestAPI {

    @GET("user/")
    Call<User> getInfoUser(@Query("user_id") String userId);

    @POST("signup/")
    Call<Result> signUp(@Body User.UserData user);

    @FormUrlEncoded
    @POST("signin/")
    Call<Result> signIn(@Field("email") String email, @Field("pws") String pws);
}

Ở trên, mình đã sử dụng việc getInfoUser thông qua phương thức GET với param là user_id, singUp thông qua POST với param body là UserData đã xây dựng ở trên
và cuối cùng là signIn thông qua POST với param là (email, pws)

Xây dựng client

public class APIClient {
    private static final String BASE_URL = "http://localhost:8800/";

    private static Retrofit retrofit = null;

    public static Retrofit getClient() {

        OkHttpClient httpClient = new OkHttpClient.Builder().build();

        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit;
    }
}

Mình sử dụng url API là "http://localhost:8800/", cái này là địa chỉ server đang chạy trên máy của mình, khi cần gọi đến API khác thì chỉ cần thay đổi url này là được. Ngoài ra các bạn có thể xây dựng phương thức getClient dạng

public static Retrofit getClient(final String baseUrl) {

    OkHttpClient httpClient = new OkHttpClient.Builder().build();

    retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

    return retrofit;
}

Như vậy, khi cần gọi đến url nào thì chỉ cần truyền vào param của phương thức getClient là OK

Cuối cùng là thực hiện call API

Mình sẽ sử dụng 2 API là signup và get thông tin user

  • API signup

    Retrofit retrofit = APIClient.getClient();
    
    RequestApi callApi = retrofit.create(RequestApi.class);
    
    Call<Result> call = callApi.signUp(userData);
    
    call.enqueue(this);
    
    @Override
    public void onResponse(Call<Result> call, Response<Result> response) {
        // Xử lý response server trả về khi sign up ở đây
    }
    
    @Override
    public void onFailure(Call<Result> call, Throwable t) {
        // Xử lý khi gọi api bị lỗi
    }
    

    Ở đây mình gửi lên server là một đối tượng UserData qua POST và nhận kết quả phản hồi từ server trong chính class đã gọi api nên mình dùng call.enqueue(this) mà không tạo mới một Callback.

  • API get thông tin user

    Retrofit retrofit = APIClient.getClient();
    
    RequestApi requestApi = retrofit.create(RequestApi.class);
    
    Call<User> call = requestApi.getInfoUser(userId);
    
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            // Xử lý response server trả về, cụ thể là thông tin user
        }
    
        @Override
        public void onFailure(Call<User> call, Throwable t) {
            // Xử lý khi gặp lỗi call api
        }
    });
    

    Ở đây thì mình đã gửi lên server param userId thông qua phương thức GET và nhận kết quả trả về trong một đối tượng Callback mới (việc tạo mới Callback để
    xử lý các bạn nên làm ở màn hình có nhiều request api, khi đó việc implement xử lý kết quả trong chính màn hình như cách trên sẽ khá là rắc rối)

Qua bài viết, mình đã giới thiệu đến các bạn cách sử dụng Retrofit trong Android, ngoài ra thì chúng ta còn có thể kết hợp Retrofit với RxJava trong việc xử lý dữ liệu nhận được từ server (mình sẽ giới thiệu nó trong bài viết sau).

Cảm ơn các bạn đã đọc, nếu có đóng góp gì hãy để lại comment để chúng ta cùng trao đổi để hoàn thiện bài viết hơn nha. Thanks !

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

leo

2 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
1 0
Tôi đã gặp vấn đề với việc đồng bộ danh bạ trên chiếc Samsung Galaxy S6 Edge của khi bật chế độ tiết kiệm pin. Sau khi tìm kiếm 1 lúc, tôi đã tìm r...
Lương Trưởng viết hơn 1 năm trước
1 0
White
9 4
Ở bài viết lần trước](), tôi đã nói về "hoàn cảnh" tại sao tôi lại cần sử dụng openssl trên android native, đồng thời cũng đã giới thiệu qua về các...
huydx viết hơn 5 năm trước
9 4
White
8 0
Gradle là gì? Sao lại xử dụng Gradle trong Android? Sử dụng Gradle như thế nào? Đó là một trong rất nhiều câu hỏi mà các Android developer mới làm ...
khoatd92 viết hơn 3 năm trước
8 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!