Apache HttpClient có thể được sử dụng để gửi các yêu cầu HTTP từ mã phía client đến server. Trong hướng dẫn trước, chúng ta đã tìm hiểu cách sử dụng HttpURLConnection để thực hiện các thao tác yêu cầu HTTP GET và POST từ chính chương trình Java.
Hôm nay, chúng ta sẽ lấy cùng một dự án ví dụ nhưng sử dụng Apache HttpClient để thực hiện các thao tác yêu cầu GET và POST.
Apache HttpClient
Để hiểu rõ hơn về chi tiết của các yêu cầu GET và POST, bạn nên xem qua ví dụ trước đó. Apache HttpClient được sử dụng rất rộng rãi để gửi các yêu cầu HTTP từ chính chương trình Java. Nếu bạn đang sử dụng Maven, thì bạn có thể thêm các dependency dưới đây và nó sẽ tự động bao gồm tất cả các dependency cần thiết khác để sử dụng Apache HttpClient:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
Tuy nhiên, nếu bạn không sử dụng Maven, thì bạn cần thêm các file jar sau vào build path của dự án để nó hoạt động:
- httpclient-4.4.jar
- httpcore-4.4.jar
- commons-logging-1.2.jar
- commons-codec-1.9.jar
Nếu bạn đang sử dụng một phiên bản Apache HttpClient khác và không dùng Maven, chỉ cần tạo một dự án Maven tạm thời để lấy danh sách các jar tương thích, như hình dưới đây.
Bây giờ, chỉ cần sao chép các file jar này vào thư mục lib (thư viện) của dự án của bạn; điều này sẽ giúp bạn tránh mọi vấn đề tương thích cũng như tiết kiệm thời gian tìm kiếm và tải các jar từ internet. Giờ đây chúng ta đã có tất cả các dependency cần thiết, dưới đây là các bước để sử dụng Apache HttpClient để gửi yêu cầu GET và POST:
- Tạo một instance của CloseableHttpClient bằng cách sử dụng lớp trợ giúp HttpClients.
- Tạo một thể hiện HttpGet hoặc HttpPost dựa trên loại yêu cầu HTTP.
- Sử dụng phương thức addHeader để thêm các header cần thiết như User-Agent, Accept-Encoding, v.v.
- Đối với yêu cầu POST, tạo danh sách NameValuePair và thêm tất cả các tham số biểu mẫu (form parameters). Sau đó, đặt nó vào entity của HttpPost.
- Nhận CloseableHttpResponse bằng cách thực thi yêu cầu HttpGet hoặc HttpPost.
- Lấy các chi tiết cần thiết như status code, error information, response html, v.v. từ response.
- Cuối cùng, đóng tài nguyên Apache HttpClient.
Dưới đây là chương trình hoàn chỉnh minh họa cách sử dụng Apache HttpClient để thực hiện các yêu cầu HTTP GET và POST trong chính một chương trình Java.
package com.journaldev.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
public class ApacheHttpClientExample {
private static final String USER_AGENT = "Mozilla/5.0";
private static final String GET_URL = "<https://localhost:9090/SpringMVCExample>";
private static final String POST_URL = "<https://localhost:9090/SpringMVCExample/home>";
public static void main(String[] args) throws IOException {
sendGET();
System.out.println("GET DONE");
sendPOST();
System.out.println("POST DONE");
}
private static void sendGET() throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(GET_URL);
httpGet.addHeader("User-Agent", USER_AGENT);
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("GET Response Status:: "
+ httpResponse.getStatusLine().getStatusCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = reader.readLine()) != null) {
response.append(inputLine);
}
reader.close();
// print result
System.out.println(response.toString());
httpClient.close();
}
private static void sendPOST() throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(POST_URL);
httpPost.addHeader("User-Agent", USER_AGENT);
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("userName", "Pankaj Kumar"));
HttpEntity postParams = new UrlEncodedFormEntity(urlParameters);
httpPost.setEntity(postParams);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
System.out.println("POST Response Status:: "
+ httpResponse.getStatusLine().getStatusCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = reader.readLine()) != null) {
response.append(inputLine);
}
reader.close();
// print result
System.out.println(response.toString());
httpClient.close();
}
}
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được đầu ra html tương tự như khi nhận được trong trình duyệt.
GET Response Status:: 200
<html><head> <title>Home</title></head><body><h1> Hello world! </h1><P> The time on the server is March 7, 2015 1:01:22 AM IST. </P></body></html>
GET DONE
POST Response Status:: 200
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<https://www.w3.org/TR/html4/loose.dtd>"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>User Home Page</title></head><body><h3>Hi Pankaj Kumar</h3></body></html>
POST DONE
Trên đây là ví dụ về Apache HttpClient. Thư viện này chứa rất nhiều phương thức tiện ích khác mà bạn có thể sử dụng. Vì vậy, tôi khuyên bạn nên tìm hiểu thêm để hiểu rõ hơn cách hoạt động của nó.