12/08/2018, 15:11

Sử dụng Retrofit và Rest trong Java

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ì ...

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>
         
        <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
go.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
go.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
go.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.

0