Apache HttpClient là một thư viện mạnh mẽ và được sử dụng phổ biến trong Java để tương tác với các dịch vụ web. Nó cung cấp nhiều phương thức linh hoạt để gửi các yêu cầu http và xử lý các phản hồi. Trong vài biết này, chúng ta sẽ cùng tìm hiểu về Apache HttpClient và cách sử dụng HttpClient trong Java.

1. Apache HttpClient là gì?

Apache HttpClient là một thư viện mã nguồn mở được phát triển bởi Apache Software Foundation, cung cấp các lớp và phương thức để tạo và thực hiện các yêu cầu HTTP đến các dịch vụ web. Nó hỗ trợ các phương thức HTTP như GET, POST, PUT, DELETE và cung cấp các tính năng phong phú để xử lý yêu cầu và phản hồi HTTP.

2. Hướng dẫn sử dụng Apache Httpclient trong Java

Để sử dụng thư viện này, bạn cần thêm một dependency vào file pom.xml nếu bạn sử dụng maven hoặc file build.gradle nếu bạn sử dụng gradle cho project của mình.

Bạn có thể tìm được dependency phù hợp với mình trên maven repository: https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5

Bạn sẽ cần tạo và sử dụng đối tượng HttpClient để gửi request và nhận dữ liệu. Một đối tượng của lớp này có thể được tạo với phương thức new DefaultHttpClient() hoặc HttpClientBuilder;

DefaultHttpClient là một HttpClient cơ bản và sử dụng lớp SingleClientConnManager để xử lý các kết nối http. Lưu ý rằng, lớp SingleClientConnManager không phải là thread-safe, điều này có nghĩa là nếu bạn truy cập đối tượng này từ nhiều thread thì nó có thể gây ra lỗi.

Gửi đi yêu cầu: HttpClient sử dụng HttpUriRequest để thực hiện gửi và nhận dữ liệu. Các lớp con quan trọng của HttpUriRequest là HttpGetHttpPost. Ngoài ra apache HttpClient còn cung cấp các lớp khác để thực hiện các request như HttpPut, HttpDelete.

Xử lý phản hồi: HttpClient cung cấp các lớp như HttpResponse, HttpEntity để nhận và xử lý phản hồi từ máy chủ. Từ đây, chúng ta có thể xử lý nội dung phản hồi nhận về được tùy theo chương trình của chúng ta.

3. Hướng dẫn sử dụng Apache HttpClient

3.1. Thao tác chung với các loại request

Đầu tiên, bạn hãy tạo một đối tượng HttpClient bằng một trong hai cách chúng ta đã cùng tìm nhiều ở trên.

Tiếp theo, hãy tạo một đối tượng phù hợp với phương thức REST bạn đang cần thực hiện. Tương ứng với các phương thức, chúng ta có các lớp sau: lớp HttpGet(phương thức get), HttpPost(phương thức post), HttpPut(phương thức put), HttpDelete(phương thức delete), các lớp này đều là kế thừa từ lớp ClassicHttpRequest

Để xử lý kết quả trả về, chúng ta cần implement interface HttpResponse<Generic> để có một đối tượng thực hiện xử lý kết quả của yêu cầu. Vì interface này là một functional interface, do đó chúng ta có thể sử dụng cú pháp lamda có dạng như sau:

HttpClientResponseHandler<T> handler = response -> {}

Cuối cùng, sau khi đã có đủ tài nguyên, chúng ta sẽ thực hiện yêu cầu bằng phương thức httpClient.execute(ClassHttpRequest, HttpClientResponseHandler);

3.2. HttpGet

HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet("https://stringee.com");

HttpClientResponseHandler<String> handler = response -> {
    int status = response.getCode();
    HttpEntity entity = response.getEntity();
    String getResponseString = entity != null ? EntityUtils.toString(entity) : null;
    if (entity != null) {
        EntityUtils.consume(entity);
    }
    System.out.printf("Execute get to %s, statusCode: %s %nResponse: %s", "stringee.com", status, getResponseString);
    return getResponseString;
};

try {
    httpClient.execute(httpGet, handler);
} catch (Exception ex) {
    System.err.println("Exception " + ex);
}

3.3. HttpPost

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost httpPost = new HttpPost("some_uri");

EntityBuilder builder = EntityBuilder
        .create()
        .setText("{}");
httpPost.setEntity(builder.build());

HttpClientResponseHandler<String> handler = response -> {
    int status = response.getCode();
    HttpEntity entity = response.getEntity();
    String getResponseString = entity != null ? EntityUtils.toString(entity) : null;
    if (entity != null) {
        EntityUtils.consume(entity);
    }
    System.out.printf("Execute post to %s, statusCode: %s %nResponse: %s", "stringee.com", status, getResponseString);
    return getResponseString;
};

try {
    httpClient.execute(httpPost, handler);
} catch (Exception ex) {
    System.err.println("Exception " + ex);
}

3.4. HttpPut

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPut httpPut = new HttpPut("some_uri");

HttpClientResponseHandler<String> handler = response -> {
    int status = response.getCode();
    HttpEntity entity = response.getEntity();
    String getResponseString = entity != null ? EntityUtils.toString(entity) : null;
    if (entity != null) {
        EntityUtils.consume(entity);
    }
    System.out.printf("Execute put to %s, statusCode: %s %nResponse: %s", "stringee.com", status, getResponseString);
    return getResponseString;
};

try {
    httpClient.execute(httpPut, handler);
} catch (Exception ex) {
    System.err.println("Exception " + ex);
}

3.5. HttpDelete

HttpClient httpClient = HttpClientBuilder.create().build();

HttpDelete httpDelete = new HttpDelete("some_uri");

HttpClientResponseHandler<String> handler = response -> {

    int status = response.getCode();
    HttpEntity entity = response.getEntity();
    String getResponseString = entity != null ? EntityUtils.toString(entity) : null;
    if (entity != null) {
        EntityUtils.consume(entity);
    }
    System.out.printf("Execute delete to %s, statusCode: %s %nResponse: %s", "stringee.com", status, getResponseString);
    return getResponseString;
};

try {
    httpClient.execute(httpDelete, handler);
} catch (Exception ex) {
    System.err.println("Exception " + ex);
}

4. Các tính năng và cải tiến

  • Hỗ trợ kết nối đồng bộ và không đồng bộ (synchronous và asynchronous).

  • Hỗ trợ proxy và xác thực HTTP.

  • Tích hợp hỗ trợ cho cookies.

  • Cung cấp cơ chế quản lý phiên (session) cho các yêu cầu liên tiếp.

  • Tùy chỉnh cấu hình linh hoạt và khả năng mở rộng.

Kết luận

Qua bài viết này, Stringee đã cùng các bạn tìm hiểu cũng như hướng dẫn cách sử dụng Apache HttpClient trong Java, đây là một bộ thư viện mạnh mẽ và được sử dụng rộng rãi. Tại thời điểm hiện tại, khi mà Java 11 đã ra mắt được một thời gian rất dài, chúng ta đã có HttpClient và có thể sử dụng thay thế cho Apache HttpClient bởi nó cũng cung cấp rất nhiều tiện ích và có lợi thế là đã được tích hợp sẵn vào JDK. Trong các bài viết tiếp theo, Stringee sẽ cùng các bạn tìm hiểu thêm nhiều kiến thức hữu dụng về Java, hãy chú ý đón xem nhé.

Stringee API cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng (CSKH) có thể được nhúng trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Điều này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp, trong khi nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.