Hầu hết chúng ta đều trưởng thành nhờ tìm hiểu các thông tin mới, những thứ như Internet là một phần quan trọng trong cuộc sống. Mọi thứ đang trở nên gắn kết hơn bao giờ hết, vì vậy xây dựng những ứng dụng Android có nội dung tĩnh có thể là một ý tưởng tồi. Thay vào đó, bạn nên xem xét việc xây dựng các ứng dụng có thể hiển thị nội dung mới mỗi khi người dùng mở chúng.
Điều đó nghe có vẻ khó khăn, nhưng với ngày càng nhiều những trang web phơi bày tài nguyên của họ thông qua REST API, điều đó trở nên khá dễ dàng. (Hãy xem Hướng dẫn cho người mới bắt đầu với HTTP và REST để có một sự hiểu biết cơ bản).
Trong hướng dẫn này, tôi sẽ cho bạn thấy cách làm thế nào để sử dụng các lớp và phương thức có sẵn trong Android SDK để kết nối với máy chủ web từ xa và tương tác với chúng bằng cách sử dụng REST API của chúng.
1.Bật truy cập Internet
Tận dụng một REST API rõ ràng là liên quan đến việc sử dụng Internet. Tuy nhiên, ứng dụng Android chỉ có thể truy cập Internet khi chúng có quyền android.permission.INTERNET
. Vì vậy, trước khi bạn bắt đầu viết bất kỳ code truy cập mạng, bạn phải chắc chắn rằng thẻ uses-permission
sau đây có ở trong tập tin manifest của dự án:
<uses-permission android:name="android.permission.INTERNET" />
Bởi vì android.permission.INTERNET
không được xem là một quyền nguy hiểm, nên bạn không cần phải yêu cầu cho nó trong runtime trên các thiết bị chạy API Level 23 hoặc cao hơn
.
2.Tạo các tiến trình nền
Nền tảng Android không cho phép bạn chạy các các tác vụ kết nối mạng trên tiến trình chính của ứng dụng. Vì vậy, tất cả các code kết nối mạng của bạn phải thuộc về một tiến trình nền. Cách dễ nhất để tạo ra một tiến trình là sử dụng phương thức execute()
của lớp AsyncTask
. Đối số duy nhất của execute()
là một đối tượng Runnable
.
AsyncTask.execute(new Runnable() {
@Override
public void run() {
// All your networking logic
// should be here
}
});
Nếu bạn muốn tìm hiểu thêm về chạy các tác vụ trong nền, tôi đề nghị bạn đọc hướng dẫn về các tác vụ nền này từ loạt bài Android từ đầu.
3.Tạo một kết nối HTTP
Bằng cách sử dụng phương thức openConnection()
của lớp URL
, bạn có thể nhanh chóng thiết lập một kết nối đến bất kỳ endpoint của REST. Giá trị trả về của openConnection()
phải được chuyển cho một đối tượng của HttpURLConnection
hoặc HttpsURLConnection
, tùy thuộc vào endpoint được truy cập thông qua HTTP hay HTTPS. HttpURLConnection
và HttpsURLConnection
đều cho phép bạn thực hiện các thao tác như thêm thông tin header và đọc các phản hồi.
Đoạn code sau đây cho bạn thấy cách thiết lập kết nối với root endpoint của GitHub API:
// Create URL
URL githubEndpoint = new URL("https://api.github.com/");
// Create connection
HttpsURLConnection myConnection =
(HttpsURLConnection) githubEndpoint.openConnection();
Lưu ý rằng lớp HttpsURLConnection
là một lớp con của lớp HttpURLConnection
.
Hầu hết các trang web cung cấp REST API muốn có khả năng xác định ứng dụng của bạn là duy nhất. Cách dễ nhất để giúp họ làm như vậy là thêm header User-Agent
duy nhất trong tất cả các yêu cầu của bạn.
Để thêm một header User-Agent
vào yêu cầu của bạn, bạn phải sử dụng phương thức setRequestProperty()
của đối tượng HttpURLConnection
. Ví dụ, ở đây là cách bạn thiết lập header User-Agent
vào my-rest-app-v0.1:
myConnection.setRequestProperty(
"User-Agent"
,
"my-rest-app-v0.1"
);
Bạn có thể thêm nhiều header vào yêu cầu của bạn bằng cách gọi phương thức setRequestProperty()
nhiều lần. Ví dụ, đoạn code sau đây thêm một header Accept
và một header Contact-Me
tuỳ biến:
myConnection.setRequestProperty("Accept",
"application/vnd.github.v3+json");
myConnection.setRequestProperty("Contact-Me",
"hathibelagal@example.com");
5.Đọc các phẩn hồi
Một khi bạn đã truyền vào tất cả các header cho yêu cầu, bạn có thể kiểm tra xem bạn có một phản hồi hợp lệ hay không bằng cách sử dụng phương thức getResponseCode()
của đối tượng HttpURLConnection
.
if (myConnection.getResponseCode() == 200) {
// Success
// Further processing here
} else {
// Error handling code goes here
}
Nếu lớp HttpURLConnection
lấy được một mã số phản hồi, chẳng hạn như 301, nó xử lý mã số một cách tự động và chuyển hướng sau đó. Vì vậy, thông thường, bạn sẽ không cần phải viết thêm bất kỳ code nào để kiểm tra chuyển hướng.
Trong trường hợp không có lỗi, bạn có thể gọi phương thức getInputStream()
để có được một tham chiếu đến Input Stream của kết nối.
InputStream responseBody = myConnection.getInputStream();
Hầu hết các RESST API ngày nay trả về dữ liệu dưới định dạng JSON hợp lệ. Vì vậy, thay vì đọc trực tiếp từ đối tượng InputStream
, tôi khuyên bạn tạo ra một InputStreamReader
cho nó.
InputStreamReader responseBodyReader =
new
InputStreamReader(responseBody,
"UTF-8"
);
6.Phân tích JSON trả về
Android SDK có một lớp gọi là JsonReader, nó giúp bạn dễ dàng có thể phân tích tài liệu JSON. Bạn có thể tạo ra một đối tượng mới của lớp JsonReader
bằng truyền đối tượng InputStreamReader
vào hàm xây dựng của nó.
1 | JsonReader jsonReader = new JsonReader(responseBodyReader);
|
Cách mà bạn trích xuất một phần cụ thể của thông tin từ tài liệu JSON phụ thuộc vào cấu trúc của nó. Ví dụ, tài liệu JSON trả về bởi root endpoint từ REST API của GitHub trông như thế này:
https://code.tutsplus.com/vi/tutorials/android-from-scratch-using-rest-apis--cms-27117