Thứ Tư, 8 tháng 4, 2015

Hướng dẫn sử dụng Retrofit trong Android

Bài viết sau đây tôi sẽ hướng dẫn các bạn tích hợp Retrofit vào trong ứng dụng Android.
Retrofit là thư viện giúp chúng ta kết nối và lấy dữ liệu từ trên Server, xây dựng hệ thống REST
ở phía Client là Android hay Java.

Đầu tiên các bạn tải Retrofit tại đây. Phiên bản mới nhất mà tôi dùng là 1.9.0.
Tiếp đó các bạn tải Gson tại đây. Lý do tải Gson là vì Restrofit sử dụng Gson là lõi.

Demo tích hợp trong project Java ( IDE tôi chọn là Eclipse).
Step1: Các bạn tạo mới dự án Java, sau đó tạo 1 folder là lib và copy 2 file .jar thư viện download
ở trên và copy vào. Add 2 lib này vào java build path.
Step2: Code
Tạo mới class GithubClient ( Hoặc copy file sample của Restrofit) cho vào project. Ở đây tôi copy từ sample của Restrofit.

[CODE]
import java.util.List;

import retrofit.RestAdapter;
import retrofit.http.GET;
import retrofit.http.Path;

public class GitHubClient {
    private static final String API_URL = "https://api.github.com";

    static class Contributor {
        String login;
        int contributions;
    }

    interface GitHub {
        @GET("/repos/{owner}/{repo}/contributors")
        List<Contributor> contributors(@Path("owner") String owner,
                @Path("repo") String repo);
    }

    public static void main(String... args) {
        // Create a very simple REST adapter which points the GitHub API
        // endpoint.
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(API_URL).build();

        // Create an instance of our GitHub API interface.
        GitHub github = restAdapter.create(GitHub.class);

        // Fetch and print a list of the contributors to this library.
        List<Contributor> contributors = github.contributors("square",
                "retrofit");
        for (Contributor contributor : contributors) {
            System.out.println(contributor.login + " ("
                    + contributor.contributions + ")");
        }
    }
}
[/CODE]

Ví dụ : tích hợp vào Android:
Step1: Tạo mới project Android.
Copy 2 file thư viện vào thư mục libs.
Ở đây tôi sẽ demo dùng API của It-ebooks.Link: http://it-ebooks-api.info/
 Chúng ta sẽ tạo ra 3 class:
1: Class Book.java:
Class này là đối tượng sẽ lưu trữ thông tin của 1 quyển sách.

import com.google.gson.annotations.SerializedName;

public class Book {
    @SerializedName(value = "ID")
    private String ID;

    @SerializedName(value = "Title")
    private String Title;

    @SerializedName(value = "Description")
    private String Description;

    @SerializedName(value = "Image")
    private String Image;

    @SerializedName(value = "isbn")
    private String isbn;

    public String getID() {
        return ID;
    }

    public void setID(String iD) {
        ID = iD;
    }

    public String getTitle() {
        return Title;
    }

    public void setTitle(String title) {
        Title = title;
    }

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }

    public String getImage() {
        return Image;
    }

    public void setImage(String image) {
        Image = image;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

}

Note: Ở trên các bạn thấy có các thuộc tính:
Ví dụ:
@SerializedName(value = "ID")
Nó sẽ tương ứng với tag Json trả về từ server.
Link lấy: http://it-ebooks-api.info/v1/search/php%20mysql
Các bạn cần phải viết đúng( kể cả in hoa) thì mới merge được kết quả vào đối tượng.

2: Class:RestClien.java
Class này sẽ giúp chúng ta cấu trúc code tốt hơn thôi, cũng không có gì ghê gớm cả.

package com.vinilearning.itebooks.bean;

import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.converter.GsonConverter;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class RestClient {
    public static final String BASE_URL = "http://it-ebooks-api.info/v1";

    private ApiService apiService;

    public RestClient() {
        RequestInterceptor requestInterceptor = new RequestInterceptor() {
            @Override
            public void intercept(RequestFacade request) {
                request.addHeader("User-Agent", "Retrofit-Sample-App");
            }
        };

        Gson gson = new GsonBuilder()
                .registerTypeAdapterFactory(new ItemTypeAdapterFactory())
                .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
                .create();

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.NONE).setEndpoint(BASE_URL)
                .setRequestInterceptor(requestInterceptor)
                .setConverter(new GsonConverter(gson)).build();

        apiService = restAdapter.create(ApiService.class);
    }

    public ApiService getApiService() {
        return apiService;
    }
}

3: Class ApiService.java
Class này sẽ tập hợp các method để query dữ liệu.
Hiện tại chỉ có 1 method để query dữ liệu theo mẫu:
API: /search/{query}

Trong đó query là tham số.

package com.vinilearning.itebooks.bean;

import java.util.ArrayList;

import retrofit.http.GET;
import retrofit.http.Path;

public interface ApiService {
    @GET("/search/{query}")
    ArrayList<Book> getBook(@Path("query") String query);
}












4: Class ItemTypeAdapterFactory.java
 Class này giúp chúng ta parse dữ liệu, bởi lẽ Restrofit sẽ chỉ parse array, mà như kết quả
ở link trên chúng ta có 1 jsonObject, trong đó có chứa jsonArray mà chúng ta cần lấy kết quả.
Ở đây là mảng "Books".

package com.vinilearning.itebooks.bean;

import java.io.IOException;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

public class ItemTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
        final TypeAdapter<JsonElement> elementAdapter = gson
                .getAdapter(JsonElement.class);

        return new TypeAdapter<T>() {

            public void write(JsonWriter out, T value) throws IOException {
                delegate.write(out, value);
            }

            public T read(JsonReader in) throws IOException {

                JsonElement jsonElement = elementAdapter.read(in);
                if (jsonElement.isJsonObject()) {
                    JsonObject jsonObject = jsonElement.getAsJsonObject();
                    if (jsonObject.has("Books")
                            && jsonObject.get("Books").isJsonArray()) {
                        jsonElement = jsonObject.get("Books");
                    }
                }

                return delegate.fromJsonTree(jsonElement);
            }
        }.nullSafe();
    }

}

Thực thi:
Các bạn sử dụng AsyncTask để lấy dữ liệu nhé, tránh bị block main thread.

class LoadData extends AsyncTask<Void, Void, ArrayList<Book>> {
        private ArrayList<Book> books;

        @Override
        protected ArrayList<Book> doInBackground(Void... params) {
            RestClient restClient = new RestClient();
            // Demo: http://it-ebooks-api.info/v1/search/php%20mysql
            books = restClient.getApiService().getBook("php mysql");
            return books;
        }

        @Override
        protected void onPostExecute(ArrayList<Book> result) {
            if (books != null && books.size() > 0) {
                Toast.makeText(getBaseContext(), "" + books.size(),
                        Toast.LENGTH_SHORT).show();

                for (Book item : books) {
                    Log.i("ITEbooks", item.getTitle() + " (" + item.getIsbn()
                            + ")");
                }
            }
            super.onPostExecute(result);
        }
    }

Trên đây là hướng dẫn cơ bản để các bạn có thể tích hợp Retrofit vào trong project Java và Android.
Các hướng dẫn chi tiết về tham số của Restrofit các bạn tham khảo tại đây
http://square.github.io/retrofit/



1 nhận xét: