Sử dụng Retrofit và Rest trong Java
Bài đăng này đã không được cập nhật trong 7 năm
1. Retrofit là gì
Retrofit là thư viện HTTP Client cho Android và Java. Retrofit giúp dễ dàng kết nối tới một REST, web sercice bằng cách sử dụng java interface Thư viện mạnh mẽ này giúp chúng ta có thể làm việc dễ dàng với dữ 2 dạng dữ liệu phổ biến là JSON và XML, khi nhận về json hoặc XML thì sẽ phân tích và tạo thành các object của java Nó cung cấp đầy đủ các phương thức GET, POST, PUT, PATCH và DELETE Giống với các thư viện mã nguồn mở khác, Retrofit được xây dựng dựa trên một số thư viện, việc phân tích JSON thì có thể sử dụng thư viện
- Gson: com.squareup.retrofit:converter-gson
- Jackson: com.squareup.retrofit:converter-jackson
- Moshi: com.squareup.retrofit:converter-moshi Phân tích XML, sử dụng thêm thư viện
- Simple Framework: com.squareup.retrofit2:converter-simpleframework
2. Sử dụng retrofit
- Cần phải có chọn class object tương ứng với JSON data
- Một interface dùng để định nghĩa các hàm và phương thức HTTP
- Tạo một Retrofit.Builder để khởi tạo các phương thức trong interface đã được định nghĩa
Mọi phương thức được định nghĩa đều dùng HTTP anotations( GET, POST, ...)
@GET("users")
Call<List<User>> getUsers()
Chúng ta có thể sử dụng URL 1 cách động dựa vào biến truyền vào, bằng cách sử dụng anotation @Path
@GET("users/{name}/commits")
Call<List<Commit>> getCommitsByName(@Path("name") String name)
Chúng ta có thể nối thêm paramater vào sau URL bằng cách sử dụng @Query
@GET("users")
Call<User> getUserById(@Query("id") Integer id)
Sử dụng retrofit để trả về tất cả ở trong body thì sử dụng @Body
@POST("users")
Call<User> postUser(@Body User user)
3. Retrofit authentication
Retrofit hỗ trợ call API cần xác thực, xác thực có thể dụng username và password ( Http Basic authentication) hoặc sử dụng Token Có 2 cách để authen, cách 1 là sử dụng token ở header, cách 2 là sử dụng OkHttp
3.1. Auth với anotations Với cách này bạn sử dụng @Header
@GET("user")
Call<UserDetails> getUserDetails(@Header("token") String token)
Việc sử dụng token là ở server sẽ qui định 1 token, ở client mỗi request sẽ gửi token đó ở header, trên server sẽ kiểm tra token ở mỗi request
3.2. Auth với Okhttp interceptors Sử dụng okhttp3.OkHttpClient.Builder.addInterceptor(Interceptor) của OkHttp Builder
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder builder = originalRequest.newBuilder().header("Authorization",
Credentials.basic("aUsername", "aPassword"));
Request newRequest = builder.build();
return chain.proceed(newRequest);
}
}).build();
Tạo authen với retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://jsonapi.org/examples/")
.client(okHttpClient)
.build();
4. Tạo project example
4.1.Tạo project với các thư viện như sau
<dependencies>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/converter-gson -->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
4.2. Tạo plan Object chứa data trả về
package ex.retrofit;
/**
* Created by FRAMGIA\ngo.dinh.ngoc on 27/04/2017.
*/
public class Change {
private String subject;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
4.3. Tạo API
package ex.retrofit;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
import java.util.List;
/**
* Created by FRAMGIA\ngo.dinh.ngoc.
*/
public interface RetrofitAPI {
@GET("changes/")
Call<List<Change>> loadChanges(@Query("q") String status);
}
4.4. Tạo main class
package ex.retrofit;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import java.util.List;
/**
* Created by FRAMGIA\ngo.dinh.ngoc.
*/
public class Main {
public static void main(String[] args) {
final String BASE_URL = "https://git.eclipse.org/r/";
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
RetrofitAPI retrofitAPI = retrofit.create(RetrofitAPI.class);
retrofitAPI.loadChanges("status:open").enqueue(new Callback<List<Change>>() {
public void onResponse(Call<List<Change>> call, Response<List<Change>> response) {
if(response.isSuccessful()) {
List<Change> changesList = response.body();
changesList.forEach(change -> System.out.println(change.getSubject()));
} else {
System.out.println(response.errorBody());
}
}
public void onFailure(Call<List<Change>> call, Throwable t) {
t.printStackTrace();
}
});
}
}
Tổng kết
Trên là hướng dẫn cơ bản về retrofit, ngoài ra bạn có thể upload, download file khi sử dụng retrofit, việc xử lý bất đồng bộ trong retrofit là rất tốt, trong java thường nếu xử lý trên web thì ít khi dùng đến thư viện này, Thư viện này được sử dụng chủ yếu trong các ứng dụng android để thao tác từ client đến server. Nếu làm các ứng dụng java liên quan đến server mà xử lý bất đồng bộ thì nên sử dụng thư viện này.
All rights reserved