Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Retrofit - cái tên quen thuộc trong xử lý API
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 !
- Link demo ví dụ: https://github.com/dinhlamvn/retrofit




