Retrofit – Thêm thông tin xác thực cho tất cả các API

Bài toán

Bạn đang xài Retrofit trên Android và bạn đang muốn thêm thông tin xác thực mỗi khi gọi API. Bài này sẽ huớng dẫn bạn làm điều đó.

Xác thực ở đây nghĩa là gì?
Một dạng token, ví dụ khi bạn login vào app, server trả về cho bạn token và yêu cầu mỗi lần gọi API tiếp theo phải đưa token này lên. Server kiểm tra token đúng thì phục vụ bạn, không thì bye bye.

Giải quyết

Như vậy bạn phải đưa userId, token vào header của mỗi request trước khi GET/POST/PUT.
Có bạn sẽ hỏi là tại sao không đưa vào params mà lại bỏ vào request header.

Cách cùi

Bạn thử nghĩ xem, nếu làm như trên, API nào bạn cũng phải truyền thêm hai tham số userIdtoken vào, code dài thêm ra, code bị lặp -> DIE, bạn biết DIE có nghĩa là gì không? Duplication Is Evil. Code duplication là một trong những điều mà dev cần phải tránh.

Cách hay hơn một tẹo

Đấy, xong phim rồi, mỗi lần gọi API chỉ cần truyền Authorization là xong.
À mình đang xài Retrofit version 2 nhé, bạn nào xài 1.9 thì mình sẽ bổ sung sau.
Happy coding!

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

8 Comments on "Retrofit – Thêm thông tin xác thực cho tất cả các API"

Notify of
avatar
Sort by:   newest | oldest | most voted
android developer
Guest

Bạn cho mình hỏi cái này private String userId;
private String accessToken; lấy ở đâu thế

Zim Tran
Guest

Cho mình hỏi hàm login với web api làm sao để nhận được token bearer

Trâm Huỳnh
Guest
đoạn code này bỏ ở đâu vậy, public static S createService(Class serviceClass, String baseUrl, final Authorization auth) { OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); Retrofit.Builder builder = new Retrofit.Builder() .baseUrl(baseUrl); if (auth != null) { httpClientBuilder.addInterceptor(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); Request.Builder requestBuilder = original.newBuilder() .header("Accept", "application/json") .header("UserId", auth.getUserId()) .header("Token", auth.getAccessToken()) .method(original.method(), original.body()); Request request = requestBuilder.build(); return chain.proceed(request); } }); } Retrofit retrofit = builder.client(httpClientBuilder.build()).build(); return retrofit.create(serviceClass); } } Bạn có thể tạo đầu đủ 1 trang login với Webapi token không, thanks