Apache HttpClient - Hướng dẫn nhanh

Giao thức truyền siêu văn bản (HTTP) là một giao thức cấp ứng dụng dành cho các hệ thống thông tin siêu phương tiện phân tán, cộng tác. Đây là nền tảng cho giao tiếp dữ liệu cho World Wide Web (tức là Internet) kể từ năm 1990. HTTP là một giao thức chung và không trạng thái có thể được sử dụng cho các mục đích khác cũng như sử dụng các phần mở rộng của các phương thức yêu cầu, mã lỗi và tiêu đề.

Về cơ bản, HTTP là một giao thức truyền thông dựa trên TCP / IP, được sử dụng để cung cấp dữ liệu (tệp HTML, tệp hình ảnh, kết quả truy vấn, v.v.) trên World Wide Web. Cổng mặc định là TCP 80, nhưng các cổng khác cũng có thể được sử dụng. Nó cung cấp một cách thức chuẩn hóa để các máy tính giao tiếp với nhau. Đặc tả HTTP xác định cách dữ liệu yêu cầu của khách hàng sẽ được xây dựng và gửi đến máy chủ cũng như cách máy chủ phản hồi các yêu cầu này.

Http Client là gì

Http client là một thư viện chuyển giao, nó nằm ở phía client, gửi và nhận các thông điệp HTTP. Nó cung cấp triển khai cập nhật, giàu tính năng và hiệu quả, đáp ứng các tiêu chuẩn HTTP gần đây.

Ngoài việc sử dụng thư viện máy khách này, người ta có thể xây dựng các ứng dụng dựa trên HTTP như trình duyệt web, máy khách dịch vụ web, v.v.

Các tính năng của Http Client

Sau đây là các tính năng nổi bật của ứng dụng khách Http:

  • Thư viện HttpClient triển khai tất cả các phương thức HTTP có sẵn.

  • Thư viện HttpClient cung cấp các API để bảo mật các yêu cầu bằng giao thức Lớp cổng bảo mật.

  • Sử dụng HttpClient, bạn có thể thiết lập kết nối bằng proxy.

  • Bạn có thể xác thực các kết nối bằng cách sử dụng các lược đồ xác thực như Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, v.v.

  • Thư viện HttpClient hỗ trợ gửi yêu cầu qua nhiều luồng. Nó quản lý nhiều kết nối được thiết lập từ các luồng khác nhau bằng cách sử dụngClientConnectionPoolManager.

  • Sử dụng thư viện Apache HttpClient, bạn có thể đặt thời gian chờ kết nối.

Trong chương này, chúng tôi sẽ giải thích cách thiết lập môi trường cho HttpClient trong Eclipse IDE. Trước khi tiến hành cài đặt, hãy đảm bảo rằng bạn đã cài đặt Eclipse trong hệ thống của mình. Nếu không, hãy tải xuống và cài đặt Eclipse.

Để biết thêm thông tin về Eclipse, vui lòng tham khảo Hướng dẫn về Eclipse của chúng tôi .

Bước 1 - Tải xuống tệp JAR phụ thuộc

Mở trang chủ chính thức của trang web HttpClient (các thành phần) và chuyển đến trang tải xuống

Sau đó, tải xuống phiên bản ổn định mới nhất của HttpClient. Ở đây, trong suốt hướng dẫn, chúng tôi đang sử dụng phiên bản 4.5.6, do đó hãy tải xuống tệp4.5.6.zip.

Trong thư mục đã tải xuống, bạn sẽ tìm thấy một thư mục có tên lib và điều này chứa các tệp Jar bắt buộc sẽ được thêm vào classpath của dự án của bạn, để hoạt động với HttpClient.

Bước 2 - Tạo dự án và thiết lập đường dẫn xây dựng

Mở nhật thực và tạo một dự án mẫu. Nhấp chuột phải vào dự án chọn tùy chọnBuild Path → Configure Build Path như hình bên dưới.

bên trong Java Build Path khung trong Libraries nhấp vào Add External JARs.

Và chọn tất cả các tệp jar trong thư mục lib và nhấp vào Apply and Close.

Bạn đã sẵn sàng làm việc với thư viện HttpClient trong nhật thực.

Phương thức GET được sử dụng để truy xuất thông tin từ máy chủ đã cho bằng cách sử dụng một URI nhất định. Các yêu cầu sử dụng GET chỉ nên truy xuất dữ liệu và không có ảnh hưởng nào khác đến dữ liệu.

API HttpClient cung cấp một lớp có tên HttpGet đại diện cho phương thức nhận yêu cầu.

Làm theo các bước dưới đây để gửi yêu cầu bằng thư viện HttpClient

Bước 1 - Tạo đối tượng HttpClient

Các createDefault() phương pháp của HttpClients lớp trả về một CloseableHttpClient đối tượng, là triển khai cơ bản của HttpClient giao diện.

Sử dụng phương pháp này, tạo một đối tượng HttpClient như hình dưới đây:

CloseableHttpClient httpclient = HttpClients.createDefault();

Bước 2 - Tạo một đối tượng HttpGet

Các HttpGet lớp đại diện cho yêu cầu HTTPGET lấy thông tin của máy chủ đã cho bằng cách sử dụng URI.

Tạo một yêu cầu HTTP GET bằng cách khởi tạo lớp này. Hàm tạo của lớp này chấp nhận một giá trị Chuỗi đại diện cho URI.

HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

Bước 3 - Thực hiện Yêu cầu Nhận

Các execute() phương pháp của CloseableHttpClient lớp chấp nhận một đối tượng HttpUriRequest (giao diện) (tức là HttpGet, HttpPost, HttpPut, HttpHead, v.v.) và trả về một đối tượng phản hồi.

Thực hiện yêu cầu bằng cách sử dụng phương pháp này như hình dưới đây -

HttpResponse httpresponse = httpclient.execute(httpget);

Thí dụ

Dưới đây là một ví dụ minh họa việc thực thi yêu cầu HTTP GET bằng thư viện HttpClient.

import java.util.Scanner;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpGetExample {
 
   public static void main(String args[]) throws Exception{
 
      //Creating a HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //Creating a HttpGet object
      HttpGet httpget = new HttpGet("https://www.tutorialspoint.com/ ");

      //Printing the method used
      System.out.println("Request Type: "+httpget.getMethod());

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httpget);

      Scanner sc = new Scanner(httpresponse.getEntity().getContent());

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
      while(sc.hasNext()) {
         System.out.println(sc.nextLine());
      }
   }
}

Đầu ra

Chương trình trên tạo ra kết quả sau:

Request Type: GET
<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<title>Parallax Scrolling, Java Cryptography, YAML, Python Data Science, Java
i18n, GitLab, TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible,
LOLCODE, Current Affairs 2018, Apache Commons Collections</title>
<meta name = "Description" content = "Parallax Scrolling, Java Cryptography, YAML,
Python Data Science, Java i18n, GitLab, TestRail, VersionOne, DBUtils, Common
CLI, Seaborn, Ansible, LOLCODE, Current Affairs 2018, Intellij Idea, Apache
Commons Collections, Java 9, GSON, TestLink, Inter Process Communication (IPC),
Logo, PySpark, Google Tag Manager, Free IFSC Code, SAP Workflow"/>
<meta name = "Keywords" content = "Python Data Science, Java i18n, GitLab,
TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible, LOLCODE, Gson,
TestLink, Inter Process Communication (IPC), Logo"/>
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href="/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
</script>
</body>
</html>

Yêu cầu POST được sử dụng để gửi dữ liệu đến máy chủ; ví dụ: thông tin khách hàng, tải lên tệp, v.v., sử dụng các biểu mẫu HTML.

API HttpClient cung cấp một lớp có tên HttpPost đại diện cho yêu cầu ĐĂNG.

Làm theo các bước dưới đây để gửi yêu cầu HTTP POST bằng thư viện HttpClient.

Bước 1 - Tạo một đối tượng HttpClient

Các createDefault() phương pháp của HttpClients lớp trả về một đối tượng của lớp CloseableHttpClient, là triển khai cơ bản của HttpClient giao diện.

Sử dụng phương pháp này, tạo một đối tượng HttpClient.

CloseableHttpClient httpClient = HttpClients.createDefault();

Bước 2 - Tạo đối tượng HttpPost

Các HttpPost lớp đại diện cho HTTP POSTyêu cầu. Thao tác này sẽ gửi dữ liệu cần thiết và truy xuất thông tin của máy chủ đã cho bằng cách sử dụng URI.

Tạo yêu cầu này bằng cách khởi tạo HttpPost và chuyển một giá trị chuỗi đại diện cho URI, như một tham số cho hàm tạo của nó.

HttpGet httpGet = new HttpGet("http://www.tutorialspoint.com/");

Bước 3 - Thực hiện Yêu cầu Nhận

Các execute() phương thức của đối tượng ClosableHttpClient chấp nhận một đối tượng HttpUriRequest (giao diện) (tức là HttpGet, HttpPost, HttpPut, HttpHead, v.v.) và trả về một đối tượng phản hồi.

HttpResponse httpResponse = httpclient.execute(httpget);

Thí dụ

Dưới đây là một ví dụ minh họa việc thực thi yêu cầu HTTP POST bằng thư viện HttpClient.

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpPostExample {
 
   public static void main(String args[]) throws Exception{
 
      //Creating a HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //Creating a HttpGet object
      HttpPost httppost = new HttpPost("https://www.tutorialspoint.com/");

      //Printing the method used
      System.out.println("Request Type: "+httppost.getMethod());

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httppost);

      Scanner sc = new Scanner(httpresponse.getEntity().getContent());

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
      while(sc.hasNext()) {
         System.out.println(sc.nextLine());
      }
   }
}

Đầu ra

Chương trình trên tạo ra kết quả sau.

Request Type: POST
<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!--> 
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<title>Parallax Scrolling, Java Cryptography, YAML, Python Data Science, Java
i18n, GitLab, TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible,
LOLCODE, Current Affairs 2018, Apache Commons Collections</title>
<meta name = "Description" content = "Parallax Scrolling, Java Cryptography, YAML,
Python Data Science, Java i18n, GitLab, TestRail, VersionOne, DBUtils, Common
CLI, Seaborn, Ansible, LOLCODE, Current Affairs 2018, Intellij Idea, Apache
Commons Collections, Java 9, GSON, TestLink, Inter Process Communication (IPC),
Logo, PySpark, Google Tag Manager, Free IFSC Code, SAP Workflow"/>
<meta name = "Keywords" content="Python Data Science, Java i18n, GitLab,
TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible, LOLCODE, Gson,
TestLink, Inter Process Communication (IPC), Logo"/>
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" conten t= "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href = "/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
</script>
</body>
</html>

Nên xử lý phản hồi HTTP bằng trình xử lý phản hồi. Trong chương này, chúng ta sẽ thảo luận về cách tạo trình xử lý phản hồi và cách sử dụng chúng để xử lý phản hồi.

Nếu bạn sử dụng trình xử lý phản hồi, tất cả các kết nối HTTP sẽ được giải phóng tự động.

Tạo một trình xử lý phản hồi

API HttpClient cung cấp một giao diện được gọi là ResponseHandler trong gói org.apache.http.client. Để tạo một trình xử lý phản hồi, hãy triển khai giao diện này và ghi đè lên handleResponse() phương pháp.

Mọi phản hồi đều có mã trạng thái và nếu mã trạng thái nằm trong khoảng từ 200 đến 300, điều đó có nghĩa là hành động đã được nhận, hiểu và chấp nhận thành công. Do đó, trong ví dụ của chúng tôi, chúng tôi sẽ xử lý các thực thể của phản hồi với mã trạng thái như vậy.

Thực thi yêu cầu bằng trình xử lý phản hồi

Làm theo các bước dưới đây để thực hiện yêu cầu bằng cách sử dụng trình xử lý phản hồi.

Bước 1 - Tạo một đối tượng HttpClient

Các createDefault() phương pháp của HttpClients lớp trả về một đối tượng của lớp CloseableHttpClient, là triển khai cơ bản của HttpClientgiao diện. Sử dụng phương pháp này tạo một đối tượng HttpClient

CloseableHttpClient httpclient = HttpClients.createDefault();

Bước 2 - Khởi tạo Trình xử lý phản hồi

Khởi tạo đối tượng trình xử lý phản hồi được tạo ở trên bằng cách sử dụng dòng mã sau:

ResponseHandler<String> responseHandler = new MyResponseHandler();

Bước 3 - Tạo một đối tượng HttpGet

Các HttpGet lớp đại diện cho yêu cầu HTTP GET lấy thông tin của máy chủ đã cho bằng cách sử dụng URI.

Tạo một yêu cầu HttpGet bằng cách khởi tạo lớp HttpGet và bằng cách truyền một chuỗi đại diện cho URI dưới dạng tham số đến phương thức khởi tạo của nó.

ResponseHandler<String> responseHandler = new MyResponseHandler();

Bước 4 - Thực hiện yêu cầu Nhận bằng trình xử lý phản hồi

Các CloseableHttpClient lớp có một biến thể của execute() phương thức chấp nhận hai đối tượng ResponseHandler và HttpUriRequest, và trả về một đối tượng phản hồi.

String httpResponse = httpclient.execute(httpget, responseHandler);

Thí dụ

Ví dụ sau minh họa việc sử dụng trình xử lý phản hồi.

import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

class MyResponseHandler implements ResponseHandler<String>{
 
   public String handleResponse(final HttpResponse response) throws IOException{

      //Get the status of the response
      int status = response.getStatusLine().getStatusCode();
      if (status >= 200 && status < 300) {
         HttpEntity entity = response.getEntity();
         if(entity == null) {
            return "";
         } else {
            return EntityUtils.toString(entity);
         }

      } else {
         return ""+status;
      }
   }
}

public class ResponseHandlerExample {
   
   public static void main(String args[]) throws Exception{
 
      //Create an HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //instantiate the response handler
      ResponseHandler<String> responseHandler = new MyResponseHandler();

      //Create an HttpGet object
      HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

      //Execute the Get request by passing the response handler object and HttpGet object
      String httpresponse = httpclient.execute(httpget, responseHandler);

      System.out.println(httpresponse);
   }
}

Đầu ra

Các chương trình trên tạo ra kết quả sau:

<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href = "/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-232293-17');
</script>
</body>

Nếu bạn đang xử lý phản hồi HTTP theo cách thủ công thay vì sử dụng trình xử lý phản hồi, bạn cần tự đóng tất cả các kết nối http. Chương này giải thích cách đóng các kết nối theo cách thủ công.

Trong khi đóng kết nối HTTP theo cách thủ công, hãy làm theo các bước dưới đây:

Bước 1 - Tạo một đối tượng HttpClient

Các createDefault() phương pháp của HttpClients lớp trả về một đối tượng của lớp CloseableHttpClient, là triển khai cơ bản của giao diện HttpClient.

Sử dụng phương pháp này, tạo một HttpClient đối tượng như hình dưới đây -

CloseableHttpClient httpClient = HttpClients.createDefault();

Bước 2 - Bắt đầu khối thử cuối cùng

Bắt đầu một khối thử cuối cùng, viết mã còn lại trong các chương trình trong khối thử và đóng đối tượng ClosableHttpClient trong khối cuối cùng.

CloseableHttpClient httpClient = HttpClients.createDefault();
try{
   //Remaining code . . . . . . . . . . . . . . .
}finally{
   httpClient.close();
}

Bước 3 - Tạo HttpGetobject

Các HttpGet lớp đại diện cho yêu cầu HTTP GET lấy thông tin của máy chủ đã cho bằng cách sử dụng URI.

Tạo một yêu cầu HTTP GET bằng cách khởi tạo lớp HttpGet bằng cách chuyển một chuỗi đại diện cho URI.

HttpGet httpGet = new HttpGet("http://www.tutorialspoint.com/");

Bước 4 - Thực hiện yêu cầu Nhận

Các execute() phương pháp của CloseableHttpClient đối tượng chấp nhận một HttpUriRequest (giao diện) đối tượng (tức là HttpGet, HttpPost, HttpPut, HttpHead, v.v.) và trả về một đối tượng phản hồi.

Thực hiện yêu cầu bằng phương pháp đã cho -

HttpResponse httpResponse = httpclient.execute(httpGet);

Bước 5 - Bắt đầu một lần thử cuối cùng (lồng nhau) khác

Bắt đầu một khối thử cuối cùng khác (được lồng trong khối thử cuối cùng trước đó), viết mã còn lại trong các chương trình trong khối thử này và đóng đối tượng HttpResponse trong khối cuối cùng.

CloseableHttpClient httpclient = HttpClients.createDefault();
try{
   . . . . . . .
   . . . . . . .
   CloseableHttpResponse httpresponse = httpclient.execute(httpget);
   try{
      . . . . . . .
      . . . . . . .
   }finally{
      httpresponse.close();
   }
}finally{
   httpclient.close();
}

Thí dụ

Bất cứ khi nào bạn tạo / lấy các đối tượng như yêu cầu, luồng phản hồi, v.v., hãy bắt đầu một khối thử cuối cùng ở dòng tiếp theo, viết đoạn mã còn lại trong khối thử và đóng đối tượng tương ứng trong khối cuối cùng như được minh họa trong chương trình sau:

import java.util.Scanner;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class CloseConnectionExample {
   
   public static void main(String args[])throws Exception{
 
      //Create an HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      try{
         //Create an HttpGet object
         HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

         //Execute the Get request
         CloseableHttpResponse httpresponse = httpclient.execute(httpget);

         try{
            Scanner sc = new Scanner(httpresponse.getEntity().getContent());
            while(sc.hasNext()) {
               System.out.println(sc.nextLine());
            }
         }finally{
            httpresponse.close();
         }
      }finally{
         httpclient.close();
      }
   }
}

Đầu ra

Khi thực hiện chương trình trên, kết quả sau được tạo:

<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href = "/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . 
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-232293-17');
</script>
</body>
</html>

Bạn có thể hủy bỏ yêu cầu HTTP hiện tại bằng cách sử dụng abort() , tức là, sau khi gọi phương thức này, theo một yêu cầu cụ thể, việc thực thi nó sẽ bị hủy bỏ.

Nếu phương thức này được gọi sau một lần thực thi, các phản hồi của lần thực thi đó sẽ không bị ảnh hưởng và các lần thực thi tiếp theo sẽ bị hủy bỏ.

Thí dụ

Nếu bạn quan sát ví dụ sau, chúng tôi đã tạo một yêu cầu HttpGet, in định dạng yêu cầu được sử dụng getMethod().

Sau đó, chúng tôi đã thực hiện một lần thực thi khác với cùng một yêu cầu. In lại dòng trạng thái bằng lần thực thi thứ nhất . Cuối cùng, in dòng trạng thái của lần thực hiện thứ hai.

Như đã thảo luận, các phản hồi của lần thực thi thứ nhất (thực hiện trước phương thức hủy bỏ) được in (bao gồm dòng trạng thái thứ hai được viết sau phương thức hủy bỏ) và, tất cả các lần thực thi tiếp theo của yêu cầu hiện tại sau khi phương thức hủy bỏ không thực hiện được ngoại lệ.

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpGetExample {
   public static void main(String args[]) throws Exception{
   
      //Creating an HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //Creating an HttpGet object
      HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

      //Printing the method used
      System.out.println(httpget.getMethod());
 
      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());

      httpget.abort();
      System.out.println(httpresponse.getEntity().getContentLength());
 
      //Executing the Get request
      HttpResponse httpresponse2 = httpclient.execute(httpget);
      System.out.println(httpresponse2.getStatusLine());
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

On executing, the above program generates the following output.
GET
HTTP/1.1 200 OK
-1
Exception in thread "main" org.apache.http.impl.execchain.RequestAbortedException:
Request aborted
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:180)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at HttpGetExample.main(HttpGetExample.java:32)

Các thiết bị chặn là những thứ giúp cản trở hoặc thay đổi các yêu cầu hoặc phản hồi. Các bộ chặn giao thức nói chung hoạt động dựa trên một tiêu đề cụ thể hoặc một nhóm các tiêu đề liên quan. Thư viện HttpClient cung cấp hỗ trợ cho các trình đánh chặn.

Yêu cầu đánh chặn

Các HttpRequestInterceptorgiao diện đại diện cho các bộ chặn yêu cầu. Giao diện này chứa một phương thức được gọi là một quy trình trong đó bạn cần viết đoạn mã để chặn các yêu cầu.

Về phía máy khách, phương pháp này xác minh / xử lý các yêu cầu trước khi gửi chúng đến máy chủ và ở phía máy chủ, phương thức này được thực thi trước khi đánh giá nội dung của yêu cầu.

Tạo trình chặn yêu cầu

Bạn có thể tạo một trình chặn yêu cầu bằng cách làm theo các bước dưới đây.

Step 1 - Create an object of HttpRequestInterceptor

Tạo một đối tượng của giao diện HttpRequestInterceptor bằng cách thực hiện quy trình phương thức trừu tượng của nó.

HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
@Override
 public void process(HttpRequest request, HttpContext context) throws
HttpException, IOException {
   //Method implementation . . . . .
};

Step 2 - Instantiate CloseableHttpClient object

Xây dựng một tùy chỉnh CloseableHttpClient đối tượng bằng cách thêm bộ chặn đã tạo ở trên vào nó như hình dưới đây -

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(requestInterceptor).build();

Sử dụng đối tượng này, bạn có thể thực hiện các yêu cầu như bình thường.

Thí dụ

Ví dụ sau minh họa việc sử dụng các bộ chặn yêu cầu. Trong ví dụ này, chúng tôi đã tạo một đối tượng HTTP GET request và thêm ba tiêu đề: sample-header, demoheader và test-header vào nó.

bên trong processor()phương pháp của trình đánh chặn, chúng tôi đang xác minh các tiêu đề của yêu cầu được gửi; nếu bất kỳ tiêu đề nào trong số đó làsample-header, chúng tôi đang cố gắng xóa nó và hiển thị danh sách các tiêu đề của yêu cầu cụ thể đó.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HttpContext;

public class InterceptorsExample {
 
   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
         @Override
         public void process(HttpRequest request, HttpContext context) throws
         HttpException, IOException {
            if(request.containsHeader("sample-header")) {
               System.out.println("Contains header sample-header, removing it..");
               request.removeHeaders("sample-header"); 
            }
            //Printing remaining list of headers
            Header[] headers= request.getAllHeaders();
            for (int i = 0; i<headers.length;i++) {
               System.out.println(headers[i].getName());
            }
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient =
      HttpClients.custom().addInterceptorFirst(requestInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Setting the header to it
      httpget1.setHeader(new BasicHeader("sample-header","My first header"));
      httpget1.setHeader(new BasicHeader("demo-header","My second header"));
      httpget1.setHeader(new BasicHeader("test-header","My third header"));

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
   }
}

Đầu ra

Khi thực hiện chương trình trên, kết quả sau được tạo:

Contains header sample-header, removing it..
demo-header
test-header
HTTP/1.1 200 OK

Máy đánh chặn phản ứng

Các HttpResponseInterceptorgiao diện đại diện cho các bộ đánh chặn phản ứng. Giao diện này chứa một phương thức được gọi làprocess(). Trong phương pháp này, bạn cần viết đoạn mã để chặn các phản hồi.

Ở phía máy chủ, phương pháp này xác minh / xử lý phản hồi trước khi gửi chúng đến máy khách và ở phía máy khách, phương thức này được thực thi trước khi đánh giá nội dung của phản hồi.

Tạo bộ đánh chặn phản hồi

Bạn có thể tạo một bộ đánh chặn phản hồi bằng cách làm theo các bước dưới đây:

Step 1 - Create an object of HttpResponseInterceptor

Tạo một đối tượng của HttpResponseInterceptor giao diện bằng cách triển khai phương thức trừu tượng của nó process.

HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
   @Override
   public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
      //Method implementation . . . . . . . .
   }
};

Bước 2: Khởi tạo đối tượng ClosableHttpClient

Xây dựng một tùy chỉnh CloseableHttpClient bằng cách thêm bộ chặn đã tạo ở trên vào nó, như được hiển thị bên dưới -

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

Sử dụng đối tượng này, bạn có thể thực hiện các yêu cầu như bình thường.

Thí dụ

Ví dụ sau minh họa việc sử dụng các bộ đánh chặn phản ứng. Trong ví dụ này, chúng tôi đã thêm ba tiêu đề: tiêu đề mẫu, tiêu đề trình diễn và tiêu đề thử nghiệm vào phản hồi trong bộ xử lý.

Sau khi thực hiện yêu cầu và nhận được phản hồi, chúng tôi đã in tên của tất cả các tiêu đề của phản hồi bằng cách sử dụng getAllHeaders() phương pháp.

Và trong đầu ra, bạn có thể quan sát tên của ba tiêu đề trong danh sách.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;

public class ResponseInterceptorsExample {

   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
         @Override
         public void process(HttpResponse response, HttpContext context) throws
         HttpException, IOException {
            System.out.println("Adding header sample_header, demo-header, test_header to the response");
            response.setHeader("sample-header", "My first header");
            response.setHeader("demo-header", "My second header");
            response.setHeader("test-header", "My third header"); 
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1); 

      //Printing remaining list of headers
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i<headers.length;i++) {
         System.out.println(headers[i].getName());
      }
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

On executing the above program generates the following output.
Adding header sample_header, demo-header, test_header to the response
Accept-Ranges
Access-Control-Allow-Headers
Access-Control-Allow-Origin
Cache-Control
Content-Type
Date
Expires
Last-Modified
Server
Vary
X-Cache
sample-header
demo-header
test-header

Sử dụng HttpClient, bạn có thể kết nối với một trang web cần tên người dùng và mật khẩu. Chương này giải thích, cách thực hiện một yêu cầu của khách hàng đối với một trang web yêu cầu tên người dùng và mật khẩu.

Bước 1 - Tạo đối tượng CredentialsProvider

Các CredentialsProviderGiao diện duy trì một bộ sưu tập để giữ thông tin đăng nhập của người dùng. Bạn có thể tạo đối tượng của nó bằng cách khởi tạoBasicCredentialsProvider lớp, việc triển khai mặc định của giao diện này.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Bước 2 - Đặt thông tin đăng nhập

Bạn có thể đặt thông tin đăng nhập cần thiết cho đối tượng CredentialsProvider bằng cách sử dụng setCredentials() phương pháp.

Phương thức này chấp nhận hai đối tượng như dưới đây:

  • AuthScope object - Phạm vi xác thực chỉ định các chi tiết như tên máy chủ, số cổng và tên lược đồ xác thực.

  • Credentials object - Chỉ định thông tin đăng nhập (tên người dùng, mật khẩu).

Đặt thông tin xác thực bằng cách sử dụng setCredentials() phương pháp cho cả máy chủ và proxy như hình dưới đây -

credsProvider.setCredentials(new AuthScope("example.com", 80), 
   new UsernamePasswordCredentials("user", "mypass"));
credsProvider.setCredentials(new AuthScope("localhost", 8000), 
   new UsernamePasswordCredentials("abc", "passwd"));

Bước 3 - Tạo một đối tượng HttpClientBuilder

Tạo một HttpClientBuilder sử dụng custom() phương pháp của HttpClients lớp học.

//Creating the HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Bước 4 - Đặt thông tin đăng nhậpPovider

Bạn có thể đặt đối tượng credentialsPovider đã tạo ở trên thành HttpClientBuilder bằng cách sử dụng setDefaultCredentialsProvider() phương pháp.

Đặt đối tượng CredentialProvider được tạo ở bước trước cho trình tạo máy khách bằng cách chuyển nó đến CredentialsProvider object() như hình dưới đây.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Bước 5 - Xây dựng ClosableHttpClient

Xây dựng CloseableHttpClient đối tượng sử dụng build() phương pháp của HttpClientBuilder lớp học.

CloseableHttpClient httpclient = clientbuilder.build()

Bước 6 - Tạo một đối tượng HttpGet và thực thi nó

Tạo một đối tượng HttpRequest bằng cách khởi tạo lớp HttpGet. Thực hiện yêu cầu này bằng cách sử dụngexecute() phương pháp.

//Creating a HttpGet object
HttpGet httpget = new HttpGet("https://www.tutorialspoint.com/ ");

//Executing the Get request
HttpResponse httpresponse = httpclient.execute(httpget);

Thí dụ

Sau đây là một chương trình ví dụ minh họa việc thực thi một yêu cầu HTTP đối với một trang web đích yêu cầu xác thực người dùng.

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;

public class UserAuthenticationExample {
   
   public static void main(String args[]) throws Exception{
      
      //Create an object of credentialsProvider
      CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

      //Set the credentials
      AuthScope scope = new AuthScope("https://www.tutorialspoint.com/questions/", 80);
      
      Credentials credentials = new UsernamePasswordCredentials("USERNAME", "PASSWORD");
      credentialsPovider.setCredentials(scope,credentials);

      //Creating the HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the credentials
      clientbuilder = clientbuilder.setDefaultCredentialsProvider(credentialsPovider);

      //Building the CloseableHttpClient object
      CloseableHttpClient httpclient = clientbuilder.build();

      //Creating a HttpGet object
      HttpGet httpget = new HttpGet("https://www.tutorialspoint.com/questions/index.php");

      //Printing the method used
      System.out.println(httpget.getMethod()); 

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
      int statusCode = httpresponse.getStatusLine().getStatusCode();
      System.out.println(statusCode);

      Header[] headers= httpresponse.getAllHeaders();
      for (int i = 0; i<headers.length;i++) {
         System.out.println(headers[i].getName());
      }
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau.

GET
HTTP/1.1 200 OK
200

Máy chủ Proxy là một máy chủ trung gian giữa máy khách và internet. Máy chủ proxy cung cấp các chức năng cơ bản sau:

  • Tường lửa và lọc dữ liệu mạng

  • Chia sẻ kết nối mạng

  • Bộ nhớ đệm dữ liệu

Sử dụng thư viện HttpClient, bạn có thể gửi một yêu cầu HTTP bằng proxy. Làm theo các bước dưới đây -

Bước 1 - Tạo một đối tượng HttpHost

Khởi tạo HttpHost lớp của org.apache.http gói bằng cách chuyển một tham số chuỗi đại diện cho tên của máy chủ proxy, (từ đó bạn cần gửi các yêu cầu) tới phương thức khởi tạo của nó.

//Creating an HttpHost object for proxy
HttpHost proxyHost = new HttpHost("localhost");

Theo cách tương tự, hãy tạo một đối tượng HttpHost khác để đại diện cho máy chủ đích mà các yêu cầu cần được gửi đến.

//Creating an HttpHost object for target
HttpHost targetHost = new HttpHost("google.com");

Bước 2 - Tạo đối tượng HttpRoutePlanner

Các HttpRoutePlannergiao diện tính toán một tuyến đường đến một máy chủ được chỉ định. Tạo một đối tượng của giao diện này bằng cách khởi tạoDefaultProxyRoutePlannerlớp, một triển khai của giao diện này. Là một tham số cho hàm tạo của nó, hãy chuyển máy chủ proxy đã tạo ở trên -

//creating a RoutePlanner object
HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyhost);

Bước 3 - Đặt công cụ lập kế hoạch lộ trình thành công cụ tạo khách hàng

Sử dụng custom() phương pháp của HttpClients lớp học, tạo một HttpClientBuilder đối tượng và đối tượng này đặt công cụ lập kế hoạch tuyến đường đã tạo ở trên, sử dụng setRoutePlanner() phương pháp.

//Setting the route planner to the HttpClientBuilder object
HttpClientBuilder clientBuilder = HttpClients.custom();

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Bước 4 - Xây dựng đối tượng ClosableHttpClient

Xây dựng CloseableHttpClient đối tượng bằng cách gọi build() phương pháp.

//Building a CloseableHttpClient
CloseableHttpClient httpClient = clientBuilder.build();

Bước 5 - Tạo HttpGetobject

Tạo một yêu cầu HTTP GET bằng cách khởi tạo HttpGet lớp học.

//Creating an HttpGet object
HttpGet httpGet = new HttpGet("/");

Bước 6 - Thực hiện yêu cầu

Một trong những biến thể của execute() phương thức chấp nhận một HttpHostHttpRequestđối tượng và thực hiện yêu cầu. Thực thi yêu cầu bằng phương pháp này -

//Executing the Get request
HttpResponse httpResponse = httpclient.execute(targetHost, httpGet);

Thí dụ

Ví dụ sau minh họa cách gửi một yêu cầu HTTP đến một máy chủ qua proxy. Trong ví dụ này, chúng tôi đang gửi một yêu cầu HTTP GET đến google.com thông qua localhost. Chúng tôi đã in tiêu đề của phản hồi và nội dung của phản hồi.

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.routing.HttpRoutePlanner;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.util.EntityUtils;

public class RequestViaProxyExample {

   public static void main(String args[]) throws Exception{
 
      //Creating an HttpHost object for proxy
      HttpHost proxyhost = new HttpHost("localhost");

      //Creating an HttpHost object for target
      HttpHost targethost = new HttpHost("google.com");
 
      //creating a RoutePlanner object
      HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyhost);

      //Setting the route planner to the HttpClientBuilder object
      HttpClientBuilder clientBuilder = HttpClients.custom();
      clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

      //Building a CloseableHttpClient
      CloseableHttpClient httpclient = clientBuilder.build();

      //Creating an HttpGet object
      HttpGet httpget = new HttpGet("/");

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(targethost, httpget);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());

      //Printing all the headers of the response
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i < headers.length; i++) {
         System.out.println(headers[i]);
      }
      
      //Printing the body of the response
      HttpEntity entity = httpresponse.getEntity();

      if (entity != null) {
         System.out.println(EntityUtils.toString(entity));
      }
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

HTTP/1.1 200 OK
Date: Sun, 23 Dec 2018 10:21:47 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.13
Last-Modified: Tue, 24 Jun 2014 10:46:24 GMT
ETag: "2e-4fc92abc3c000"
Accept-Ranges: bytes
Content-Length: 46
Content-Type: text/html
<html><body><h1>It works!</h1></body></html>

Trong chương này, chúng ta sẽ tìm hiểu cách tạo HttpRequest được xác thực bằng tên người dùng và mật khẩu và chuyển nó qua proxy đến máy chủ đích, sử dụng một ví dụ.

Bước 1 - Tạo đối tượng CredentialsProvider

Giao diện CredentialsProvider duy trì một bộ sưu tập để giữ thông tin đăng nhập của người dùng. Bạn có thể tạo đối tượng của nó bằng cách khởi tạo lớp BasicCredentialsProvider, phần triển khai mặc định của giao diện này.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Bước 2 - Đặt thông tin đăng nhập

Bạn có thể đặt thông tin đăng nhập cần thiết cho đối tượng CredentialsProvider bằng cách sử dụng setCredentials()phương pháp. Phương thức này chấp nhận hai đối tượng -

  • AuthScope object - Phạm vi xác thực chỉ định các chi tiết như tên máy chủ, số cổng và tên lược đồ xác thực.

  • Credentials object- Chỉ định thông tin đăng nhập (tên người dùng, mật khẩu). Đặt thông tin xác thực bằng cách sử dụngsetCredentials() cho cả máy chủ và proxy như hình dưới đây.

credsProvider.setCredentials(new AuthScope("example.com", 80), new
   UsernamePasswordCredentials("user", "mypass"));
credsProvider.setCredentials(new AuthScope("localhost", 8000), new
   UsernamePasswordCredentials("abc", "passwd"));

Bước 3 - Tạo một đối tượng HttpClientBuilder

Tạo một HttpClientBuilder sử dụng custom() phương pháp của HttpClients lớp như hình dưới đây -

//Creating the HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Bước 4 - Đặt CredentialsProvider

Bạn có thể đặt đối tượng CredentialsProvider thành đối tượng HttpClientBuilder bằng cách sử dụng setDefaultCredentialsProvider()phương pháp. Vượt qua cái đã tạo trước đóCredentialsProvider phản đối phương pháp này.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Bước 5 - Xây dựng ClosableHttpClient

Xây dựng CloseableHttpClient đối tượng sử dụng build() phương pháp.

CloseableHttpClient httpclient = clientbuilder.build();

Bước 6 - Tạo proxy và máy chủ đích

Tạo máy chủ đích và máy chủ proxy bằng cách khởi tạo HttpHost lớp học.

//Creating the target and proxy hosts
HttpHost target = new HttpHost("example.com", 80, "http");
HttpHost proxy = new HttpHost("localhost", 8000, "http");

Bước 7 - Đặt proxy và xây dựng đối tượng RequestConfig

Tạo một RequestConfig.Builder đối tượng sử dụng custom()phương pháp. Đặt đối tượng proxyHost đã tạo trước đó thànhRequestConfig.Builder sử dụng setProxy()phương pháp. Cuối cùng, xây dựngRequestConfig đối tượng sử dụng build() phương pháp.

RequestConfig.Builder reqconfigconbuilder= RequestConfig.custom();
reqconfigconbuilder = reqconfigconbuilder.setProxy(proxyHost);
RequestConfig config = reqconfigconbuilder.build();

Bước 8 - Tạo một đối tượng yêu cầu HttpGet và đặt đối tượng cấu hình cho nó.

Tạo một HttpGetđối tượng bằng cách khởi tạo lớp HttpGet. Đặt đối tượng cấu hình đã tạo ở bước trước thành đối tượng này bằng cách sử dụngsetConfig() phương pháp.

//Create the HttpGet request object
HttpGet httpGet = new HttpGet("/");

//Setting the config to the request
httpget.setConfig(config);

Bước 9 - Thực hiện yêu cầu

Thực thi yêu cầu bằng cách chuyển đối tượng HttpHost (đích) và yêu cầu (HttpGet) làm tham số cho execute() phương pháp.

HttpResponse httpResponse = httpclient.execute(targetHost, httpget);

Thí dụ

Ví dụ sau minh họa cách thực hiện một yêu cầu HTTP thông qua một proxy bằng tên người dùng và mật khẩu.

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;

public class ProxyAuthenticationExample {
   public static void main(String[] args) throws Exception {

      //Creating the CredentialsProvider object
      CredentialsProvider credsProvider = new BasicCredentialsProvider();

      //Setting the credentials
      credsProvider.setCredentials(new AuthScope("example.com", 80), 
         new UsernamePasswordCredentials("user", "mypass"));
      credsProvider.setCredentials(new AuthScope("localhost", 8000), 
         new UsernamePasswordCredentials("abc", "passwd"));

      //Creating the HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the credentials
      clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);
      
      //Building the CloseableHttpClient object
      CloseableHttpClient httpclient = clientbuilder.build();


      //Create the target and proxy hosts
      HttpHost targetHost = new HttpHost("example.com", 80, "http");
      HttpHost proxyHost = new HttpHost("localhost", 8000, "http");

      //Setting the proxy
      RequestConfig.Builder reqconfigconbuilder= RequestConfig.custom();
      reqconfigconbuilder = reqconfigconbuilder.setProxy(proxyHost);
      RequestConfig config = reqconfigconbuilder.build();

      //Create the HttpGet request object
      HttpGet httpget = new HttpGet("/");

      //Setting the config to the request
      httpget.setConfig(config);
 
      //Printing the status line
      HttpResponse response = httpclient.execute(targetHost, httpget);
      System.out.println(response.getStatusLine());

   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

HTTP/1.1 200 OK

Sử dụng thư viện HttpClient, bạn có thể gửi yêu cầu hoặc đăng nhập vào biểu mẫu bằng cách chuyển các tham số.

Làm theo các bước dưới đây để đăng nhập vào một biểu mẫu.

Bước 1 - Tạo một đối tượng HttpClient

Các createDefault() phương pháp của HttpClients lớp trả về một đối tượng của lớp CloseableHttpClient, là triển khai cơ bản của giao diện HttpClient. Sử dụng phương pháp này, tạo một đối tượng HttpClient -

CloseableHttpClient httpClient = HttpClients.createDefault();

Bước 2 - Tạo một đối tượng RequestBuilder

Lớp RequestBuilderđược sử dụng để xây dựng yêu cầu bằng cách thêm các tham số vào nó. Nếu loại yêu cầu là PUT hoặc POST, nó sẽ thêm các tham số vào yêu cầu dưới dạng thực thể được mã hóa URL

Tạo một đối tượng RequestBuilder (thuộc loại POST) bằng phương thức post ().

//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post();

Bước 3 - Đặt Uri và các tham số cho RequestBuilder.

Đặt URI và các tham số cho đối tượng RequestBuilder bằng cách sử dụng setUri()addParameter() các phương thức của lớp RequestBuilder.

//Set URI and parameters
RequestBuilder reqbuilder = reqbuilder.setUri("http://httpbin.org/post");
reqbuilder = reqbuilder1.addParameter("Name", "username").addParameter("password", "password");

Bước 4 - Xây dựng đối tượng HttpUriRequest

Sau khi thiết lập các thông số cần thiết, hãy xây dựng HttpUriRequest đối tượng sử dụng build() phương pháp.

//Building the HttpUriRequest object
HttpUriRequest httppost = reqbuilder2.build();

Bước 5 - Thực hiện yêu cầu

Phương thức thực thi của đối tượng ClosableHttpClient chấp nhận một đối tượng HttpUriRequest (giao diện) (tức là HttpGet, HttpPost, HttpPut, HttpHead, v.v.) và trả về một đối tượng phản hồi.

Thực thi HttpUriRequest đã tạo ở các bước trước bằng cách chuyển nó đến execute() phương pháp.

//Execute the request
HttpResponse httpresponse = httpclient.execute(httppost);

Thí dụ

Ví dụ sau minh họa cách đăng nhập vào biểu mẫu bằng cách gửi thông tin đăng nhập. Ở đây, chúng tôi đã gửi hai tham số -username and password vào một biểu mẫu và cố gắng in thực thể thông báo và trạng thái của yêu cầu.

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;

public class FormLoginExample {
 
   public static void main(String args[]) throws Exception {

      //Creating CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();
 
      //Creating the RequestBuilder object
      RequestBuilder reqbuilder = RequestBuilder.post();

      //Setting URI and parameters
      RequestBuilder reqbuilder1 = reqbuilder.setUri("http://httpbin.org/post");
      RequestBuilder reqbuilder2 = reqbuilder1.addParameter("Name", 
         "username").addParameter("password", "password");

      //Building the HttpUriRequest object
      HttpUriRequest httppost = reqbuilder2.build();

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httppost);

      //Printing the status and the contents of the response
      System.out.println(EntityUtils.toString(httpresponse.getEntity()));
      System.out.println(httpresponse.getStatusLine());
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

{
   "args": {},
   "data": "",
   "files": {},
   "form": {
      "Name": "username",
      "password": "password"
   },
   "headers": {
      "Accept-Encoding": "gzip,deflate",
      "Connection": "close",
      "Content-Length": "31",
      "Content-Type": "application/x-www-form-urlencoded; charset = UTF-8",
      "Host": "httpbin.org",
      "User-Agent": "Apache-HttpClient/4.5.6 (Java/1.8.0_91)"
   },
   "json": null,
   "origin": "117.216.245.180",
   "url": "http://httpbin.org/post"
}
HTTP/1.1 200 OK

Đăng nhập biểu mẫu bằng Cookie

Nếu biểu mẫu của bạn lưu trữ cookie, thay vì tạo mặc định CloseableHttpClient vật.

Create a CookieStore object bằng cách khởi tạo lớp BasicCookieStore.

//Creating a BasicCookieStore object
BasicCookieStore cookieStore = new BasicCookieStore();

Create a HttpClientBuilder sử dụng custom() phương pháp của HttpClients lớp học.

//Creating an HttpClientBuilder object
HttpClientBuilder clientbuilder = HttpClients.custom();

Set the cookie store to the client builder bằng phương thức setDefaultCookieStore ().

//Setting default cookie store to the client builder object
Clientbuilder = clientbuilder.setDefaultCookieStore(cookieStore);

Xây dựng CloseableHttpClient đối tượng sử dụng build() phương pháp.

//Building the CloseableHttpClient object
CloseableHttpClient httpclient = clientbuilder1.build();

Xây dựng HttpUriRequest đối tượng như được chỉ định ở trên bằng cách truyền thực thi yêu cầu.

Nếu trang lưu trữ cookie, các thông số bạn đã vượt qua sẽ được thêm vào kho lưu trữ cookie.

Bạn có thể in nội dung của CookieStore đối tượng nơi bạn có thể xem các thông số của mình (cùng với những thông số trước đó mà trang được lưu trữ trong trường hợp).

Để in cookie, hãy lấy tất cả cookie từ CookieStore đối tượng sử dụng getCookies()phương pháp. Phương thức này trả về mộtListvật. Sử dụng Iterator, in nội dung các đối tượng danh sách như hình dưới đây:

//Printing the cookies
List list = cookieStore.getCookies();

System.out.println("list of cookies");
Iterator it = list.iterator();
if(it.hasNext()) {
   System.out.println(it.next());
}

Cookie là các tệp văn bản được lưu trữ trên máy khách và chúng được lưu giữ cho các mục đích theo dõi thông tin khác nhau.

HttpClient cung cấp hỗ trợ cho các cookie mà bạn có thể tạo và quản lý cookie.

Tạo một cookie

Làm theo các bước dưới đây để tạo cookie bằng thư viện HttpClient.

Bước 1 - Tạo đối tượng Cookestore

Các CookieStoregiao diện đại diện cho cửa hàng trừu tượng cho các đối tượng Cookie. Bạn có thể tạo một kho lưu trữ cookie bằng cách khởi tạoBasicCookieStore lớp, một triển khai mặc định của giao diện này.

//Creating the CookieStore object
CookieStore cookieStore = new BasicCookieStore();

Bước 2 - Tạo đối tượng ClientCookie

Ngoài các chức năng của cookie, ClientCookie có thể lấy cookie gốc trong máy chủ. Bạn có thể tạo cookie khách hàng bằng cách khởi tạoBasicClientCookielớp học. Đối với hàm tạo của lớp này, bạn cần chuyển cặp khóa-giá trị mà bạn muốn lưu trữ trong cookie cụ thể đó.

//Creating client cookie
BasicClientCookie clientCookie = new BasicClientCookie("name","Raju");

Bước 3 - Đặt giá trị cho cookie

Đối với cookie khách hàng, bạn có thể đặt / xóa đường dẫn, giá trị, phiên bản, ngày hết hạn, miền, nhận xét và thuộc tính bằng các phương pháp tương ứng.

Calendar myCal = new GregorianCalendar(2018, 9, 26);
Date expiryDate = myCal.getTime();
clientcookie.setExpiryDate(expiryDate);
clientcookie.setPath("/");
clientcookie.setSecure(true);
clientcookie.setValue("25");
clientcookie.setVersion(5);

Bước 4 - Thêm cookie vào kho cookie

Bạn có thể thêm cookie vào kho cookie bằng cách sử dụng addCookie() phương pháp của BasicCookieStore lớp học.

Thêm các cookie cần thiết vào Cookiestore.

//Adding the created cookies to cookie store
cookiestore.addCookie(clientcookie);

Thí dụ

Ví dụ sau minh họa cách tạo cookie và thêm chúng vào kho cookie. Ở đây, chúng tôi đã tạo một kho lưu trữ cookie, một loạt các cookie bằng cách đặt các giá trị tên miền và đường dẫn, đồng thời thêm chúng vào kho lưu trữ cookie.

import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;

public class CookieHandlingExample {
   
   public static void main(String args[]) throws Exception{
      
      //Creating the CookieStore object
      CookieStore cookiestore = new BasicCookieStore();
 
      //Creating client cookies
      BasicClientCookie clientcookie1 = new BasicClientCookie("name","Raju");
      BasicClientCookie clientcookie2 = new BasicClientCookie("age","28");
      BasicClientCookie clientcookie3 = new BasicClientCookie("place","Hyderabad");

      //Setting domains and paths to the created cookies
      clientcookie1.setDomain(".sample.com");
      clientcookie2.setDomain(".sample.com");
      clientcookie3.setDomain(".sample.com");

      clientcookie1.setPath("/");
      clientcookie2.setPath("/");
      clientcookie3.setPath("/");
 
      //Adding the created cookies to cookie store
      cookiestore.addCookie(clientcookie1);
      cookiestore.addCookie(clientcookie2);
      cookiestore.addCookie(clientcookie3);
   }
}

Lấy một cookie

Bạn có thể thêm cookie vào cửa hàng cookie bằng cách sử dụng getCookies() phương pháp của asicCookieStorelớp học. Phương thức này trả về một danh sách chứa tất cả cookie trong kho cookie.

Bạn có thể in nội dung của kho lưu trữ cookie bằng cách sử dụng Iterator như hình dưới đây -

//Retrieving the cookies
List list = cookieStore.getCookies();

//Creating an iterator to the obtained list
Iterator it = list.iterator();
while(it.hasNext()) {
   System.out.println(it.next());
}

Thí dụ

Ví dụ sau minh họa cách lấy cookie từ kho cookie. Ở đây, chúng tôi đang thêm một loạt cookie vào kho lưu trữ cookie và lấy lại chúng.

import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;

public class CookieHandlingExample {
 
   public static void main(String args[]) throws Exception{
      
      //Creating the CookieStore object
      CookieStore cookiestore = new BasicCookieStore();
      
      //Creating client cookies
      BasicClientCookie clientcookie1 = new BasicClientCookie("name","Raju");
      BasicClientCookie clientcookie2 = new BasicClientCookie("age","28");
      BasicClientCookie clientcookie3 = new BasicClientCookie("place","Hyderabad");

      //Setting domains and paths to the created cookies
      clientcookie1.setDomain(".sample.com");
      clientcookie2.setDomain(".sample.com");
      clientcookie3.setDomain(".sample.com");

      clientcookie1.setPath("/");
      clientcookie2.setPath("/");
      clientcookie3.setPath("/");
 
      //Adding the created cookies to cookie store
      cookiestore.addCookie(clientcookie1);
      cookiestore.addCookie(clientcookie2);
      cookiestore.addCookie(clientcookie3);
   }
}

Đầu ra

Khi thực thi, chương trình này tạo ra kết quả sau:

[version: 0][name: age][value: 28][domain: .sample.com][path: /][expiry: null]
[version: 0][name: name][value: Raju][domain: my.example.com][path: /][expiry:
null]
[version: 0][name: place][value: Hyderabad][domain: .sample.com][path:
/][expiry: null]

Một chương trình đa luồng chứa hai hoặc nhiều phần có thể chạy đồng thời và mỗi phần có thể xử lý một nhiệm vụ khác nhau cùng một lúc để sử dụng tối ưu các tài nguyên có sẵn.

Bạn có thể thực hiện các yêu cầu từ nhiều luồng bằng cách viết một chương trình HttpClient đa luồng.

Nếu bạn muốn thực hiện nhiều yêu cầu khách hàng từ các chuỗi liên tục, bạn cần tạo ClientConnectionPoolManager. Nó duy trì một nhómHttpClientConnections và phục vụ nhiều yêu cầu từ các chủ đề.

Trình quản lý kết nối gộp các kết nối dựa trên tuyến đường. Nếu người quản lý có kết nối cho một tuyến đường cụ thể, thì nó sẽ phục vụ các yêu cầu mới trong các tuyến đường đó bằng cách cho thuê một kết nối hiện có từ nhóm, thay vì tạo một kết nối mới.

Làm theo các bước để thực hiện yêu cầu từ nhiều chuỗi -

Bước 1 - Tạo Trình quản lý nhóm kết nối máy khách

Tạo Trình quản lý nhóm kết nối máy khách bằng cách khởi tạo PoolingHttpClientConnectionManager lớp học.

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

Bước 2 - Đặt số lượng kết nối tối đa

Đặt số lượng kết nối tối đa trong nhóm bằng cách sử dụng setMaxTotal() phương pháp.

//Set the maximum number of connections in the pool
connManager.setMaxTotal(100);

Bước 3 - Tạo một đối tượng ClientBuilder

Tạo một ClientBuilder Đối tượng bằng cách đặt trình quản lý kết nối bằng cách sử dụng setConnectionManager() như hình dưới đây -

HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);

Bước 4 - Tạo các đối tượng yêu cầu HttpGet

Khởi tạo lớp HttpGet bằng cách truyền URI mong muốn đến phương thức khởi tạo của nó dưới dạng tham số.

HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . .

Bước 5 - Triển khai phương thức chạy

Đảm bảo rằng bạn đã tạo một lớp, biến nó thành một luồng (bằng cách mở rộng lớp luồng hoặc, bằng cách triển khai giao diện Runnable) và triển khai phương thức run.

public class ClientMultiThreaded extends Thread {
   public void run() {
      //Run method implementation . . . . . . . . . .
   }
}

Bước 6 - Tạo đối tượng Chủ đề

Tạo các đối tượng luồng bằng cách khởi tạo lớp Thread (ClientMultiThreaded) đã tạo ở trên.

Truyền một đối tượng HttpClient, đối tượng HttpGet tương ứng và, một số nguyên đại diện cho ID đến các luồng này.

ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Bước 7 - Bắt đầu và tham gia các chuỗi

Bắt đầu tất cả các chuỗi bằng cách sử dụng start() phương pháp và tham gia với họ bằng cách tham gia method().

thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .

Bước 8 - Chạy triển khai phương pháp

Trong phương thức chạy, thực hiện yêu cầu, truy xuất phản hồi và in kết quả.

Thí dụ

Ví dụ sau minh họa việc thực thi các yêu cầu HTTP đồng thời từ nhiều luồng. Trong ví dụ này, chúng tôi đang cố gắng thực hiện các yêu cầu khác nhau từ các luồng khác nhau và cố gắng in trạng thái và số byte được đọc bởi mỗi máy khách.

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class ClientMultiThreaded extends Thread {
   CloseableHttpClient httpClient;
   HttpGet httpget;
   int id;
 
   public ClientMultiThreaded(CloseableHttpClient httpClient, HttpGet httpget,
   int id) {
      this.httpClient = httpClient;
      this.httpget = httpget;
      this.id = id;
   }
   @Override
   public void run() {
      try{
         //Executing the request
         CloseableHttpResponse httpresponse = httpClient.execute(httpget);

         //Displaying the status of the request.
         System.out.println("status of thread "+id+":"+httpresponse.getStatusLine());

         //Retrieving the HttpEntity and displaying the no.of bytes read
         HttpEntity entity = httpresponse.getEntity();
         if (entity != null) {
            System.out.println("Bytes read by thread thread "+id+":
               "+EntityUtils.toByteArray(entity).length);
         }
      }catch(Exception e) {
         System.out.println(e.getMessage());
      }
   }
      
   public static void main(String[] args) throws Exception {

      //Creating the Client Connection Pool Manager by instantiating the PoolingHttpClientConnectionManager class.
      PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

      //Set the maximum number of connections in the pool
      connManager.setMaxTotal(100);

      //Create a ClientBuilder Object by setting the connection manager
      HttpClientBuilder clientbuilder = HttpClients.custom().setConnectionManager(connManager);
 
      //Build the CloseableHttpClient object using the build() method.
      CloseableHttpClient httpclient = clientbuilder.build();

      //Creating the HttpGet requests
      HttpGet httpget1 = new HttpGet("http://www.tutorialspoint.com/");
      HttpGet httpget2 = new HttpGet("http://www.google.com/");
      HttpGet httpget3 = new HttpGet("https://www.qries.com/");
      HttpGet httpget4 = new HttpGet("https://in.yahoo.com/");
 
      //Creating the Thread objects
      ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
      ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
      ClientMultiThreaded thread3 = new ClientMultiThreaded(httpclient,httpget3, 3);
      ClientMultiThreaded thread4 = new ClientMultiThreaded(httpclient,httpget4, 4);

      //Starting all the threads
      thread1.start();
      thread2.start();
      thread3.start();
      thread4.start();

      //Joining all the threads
      thread1.join();
      thread2.join();
      thread3.join();
      thread4.join();
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

status of thread 1: HTTP/1.1 200 OK
Bytes read by thread thread 1: 36907
status of thread 2: HTTP/1.1 200 OK
Bytes read by thread thread 2: 13725
status of thread 3: HTTP/1.1 200 OK
Bytes read by thread thread 3: 17319
status of thread 4: HTTP/1.1 200 OK
Bytes read by thread thread 4: 127018

Sử dụng Lớp cổng bảo mật, bạn có thể thiết lập kết nối an toàn giữa máy khách và máy chủ. Nó giúp bảo vệ thông tin nhạy cảm như số thẻ tín dụng, tên người dùng, mật khẩu, ghim, v.v.

Bạn có thể làm cho các kết nối an toàn hơn bằng cách tạo ngữ cảnh SSL của riêng bạn bằng cách sử dụng HttpClient thư viện.

Làm theo các bước dưới đây để tùy chỉnh SSLContext bằng thư viện HttpClient -

Bước 1 - Tạo đối tượng SSLContextBuilder

SSLContextBuilderlà trình xây dựng cho các đối tượng SSLContext. Tạo đối tượng của nó bằng cách sử dụngcustom() phương pháp của SSLContexts lớp học.

//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();

Bước 2 - Tải Keystore

Trong đường dẫn Java_home_directory/jre/lib/security/, bạn có thể tìm thấy một tệp có tên cacerts. Lưu tệp này dưới dạng tệp lưu trữ khóa của bạn (với phần mở rộng .jks). Tải tệp kho khóa và mật khẩu của nó (làchangeit theo mặc định) bằng cách sử dụng loadTrustMaterial() phương pháp của SSLContextBuilder lớp học.

//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file, "changeit".toCharArray());

Bước 3 - xây dựng một đối tượng SSLContext

Đối tượng SSLContext đại diện cho việc triển khai giao thức ổ cắm an toàn. Xây dựng một văn bản SSLC bằng cách sử dụngbuild() phương pháp.

//Building the SSLContext
SSLContext sslContext = SSLBuilder.build();

Bước 4 - Tạo đối tượng SSLConnectionSocketFactory

SSLConnectionSocketFactorylà một nhà máy sản xuất socket phân lớp cho các kết nối TSL và SSL. Bằng cách sử dụng này, bạn có thể xác minh máy chủ Https bằng danh sách các chứng chỉ đáng tin cậy và xác thực máy chủ Https đã cho.

Bạn có thể tạo điều này bằng nhiều cách. Tùy thuộc vào cách bạn tạoSSLConnectionSocketFactory đối tượng, bạn có thể cho phép tất cả các máy chủ, chỉ cho phép các chứng chỉ tự ký, chỉ cho phép các giao thức cụ thể, v.v.

To allow only particular protocols, tạo nên SSLConnectionSocketFactory đối tượng bằng cách truyền một đối tượng SSLContext, mảng chuỗi đại diện cho các giao thức cần được hỗ trợ, mảng chuỗi đại diện cho các bộ mật mã cần được hỗ trợ và một đối tượng HostnameVerifier tới phương thức khởi tạo của nó.

new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,    
   SSLConnectionSocketFactory.getDefaultHostnameVerifier());

To allow all hosts, tạo nên SSLConnectionSocketFactory đối tượng bằng cách chuyển một đối tượng SSLContext và một NoopHostnameVerifier vật.

//Creating SSLConnectionSocketFactory SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());

Bước 5 - Tạo một đối tượng HttpClientBuilder

Tạo một đối tượng HttpClientBuilder bằng cách sử dụng custom() phương pháp của HttpClients lớp học.

//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Bước 6 - Đặt đối tượng SSLConnectionSocketFactory

Đặt đối tượng SSLConnectionSocketFactory thành HttpClientBuilder sử dụng setSSLSocketFactory() phương pháp.

//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);

Bước 7 - Xây dựng đối tượng ClosableHttpClient

Xây dựng CloseableHttpClient đối tượng bằng cách gọi build() phương pháp.

//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();

Bước 8 - Tạo một đối tượng HttpGet

Các HttpGet lớp đại diện cho yêu cầu HTTP GET lấy thông tin của máy chủ đã cho bằng cách sử dụng URI.

Tạo một yêu cầu HTTP GET bằng cách khởi tạo lớp HttpGet bằng cách chuyển một chuỗi đại diện cho URI.

//Creating the HttpGet request
HttpGet httpget = new HttpGet("https://example.com/");

Bước 9 - Thực hiện yêu cầu

Thực hiện yêu cầu bằng cách sử dụng execute() phương pháp.

//Executing the request
HttpResponse httpresponse = httpclient.execute(httpget);

Thí dụ

Ví dụ sau minh họa sự tùy chỉnh của SSLContrext -

import java.io.File;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

public class ClientCustomSSL {
   
   public final static void main(String[] args) throws Exception {

      //Creating SSLContextBuilder object
      SSLContextBuilder SSLBuilder = SSLContexts.custom();
  
      //Loading the Keystore file
      File file = new File("mykeystore.jks");
      SSLBuilder = SSLBuilder.loadTrustMaterial(file,
         "changeit".toCharArray());

      //Building the SSLContext usiong the build() method
      SSLContext sslcontext = SSLBuilder.build();
 
      //Creating SSLConnectionSocketFactory object
      SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
 
      //Creating HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the SSLConnectionSocketFactory
      clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);

      //Building the CloseableHttpClient
      CloseableHttpClient httpclient = clientbuilder.build();
      
      //Creating the HttpGet request
      HttpGet httpget = new HttpGet("https://example.com/");
 
      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //printing the status line
      System.out.println(httpresponse.getStatusLine());

      //Retrieving the HttpEntity and displaying the no.of bytes read
      HttpEntity entity = httpresponse.getEntity();
      if (entity != null) {
         System.out.println(EntityUtils.toByteArray(entity).length);
      } 
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau.

HTTP/1.1 200 OK
1270

Sử dụng HttpClient, chúng tôi có thể thực hiện tải lên Multipart, tức là chúng tôi có thể tải lên các đối tượng lớn hơn ở các phần nhỏ hơn. Trong chương này, chúng tôi chứng minh tải lên nhiều phần trong ứng dụng khách HTTP bằng cách tải lên một tệp văn bản đơn giản.

Nói chung, bất kỳ tải lên nhiều phần nào đều chứa ba phần.

  • Bắt đầu tải lên

  • Tải lên các bộ phận của đối tượng

  • Hoàn thành tải lên Multipart

Để tải lên nhiều phần bằng HttpClient, chúng ta cần làm theo các bước sau:

  • Tạo một trình tạo nhiều phần.

  • Thêm các bộ phận mong muốn vào nó.

  • Hoàn thành quá trình xây dựng và lấy HttpEntity nhiều phần.

  • Xây dựng yêu cầu bằng cách đặt thực thể muti-part ở trên.

  • Thực hiện yêu cầu.

Sau đây là các bước để tải lên thực thể nhiều phần bằng thư viện HttpClient.

Bước 1 - Tạo một đối tượng HttpClient

Các createDefault() phương pháp của HttpClients lớp trả về một đối tượng của lớp CloseableHttpClient, là triển khai cơ bản của giao diện HttpClient. Sử dụng phương pháp này, tạo một đối tượng HttpClient -

//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();

Bước 2 - Tạo một đối tượng FileBody

FileBodylớp đại diện cho phần nội dung nhị phân được hỗ trợ bởi một tệp. Khởi tạo lớp này bằng cách chuyển mộtFile đối tượng và một ContentType đối tượng đại diện cho loại nội dung.

//Creating a File object
File file = new File("sample.txt");

//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

Bước 3 - Tạo MultipartEntityBuilder

Các MultipartEntityBuilder lớp được sử dụng để xây dựng nhiều phần HttpEntityvật. Tạo đối tượng của nó bằng cách sử dụngcreate() phương thức (của cùng một lớp).

//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

Bước 4 - Đặt chế độ

A MultipartEntityBuildercó ba chế độ: STRICT, RFC6532 và BROWSER_COMPATIBLE. Đặt nó ở chế độ mong muốn bằng cách sử dụngsetMode() phương pháp.

//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

Bước 5 - Thêm nhiều phần khác nhau mong muốn

Sử dụng các phương pháp addTextBody(), addPart () và, addBinaryBody(), bạn có thể thêm văn bản đơn giản, tệp, luồng và các đối tượng khác vào MultipartBuilder. Thêm nội dung mong muốn bằng các phương pháp này.

//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));

Bước 6 - Xây dựng thực thể đơn lẻ

Bạn có thể xây dựng tất cả các phần này thành một thực thể duy nhất bằng cách sử dụng build() phương pháp của MultipartEntityBuilderlớp học. Sử dụng phương pháp này, xây dựng tất cả các phần thành mộtHttpEntity.

//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build();

Bước 7 - Tạo một đối tượng RequestBuilder

Lớp RequestBuilderđược sử dụng để xây dựng yêu cầu bằng cách thêm các tham số vào nó. Nếu yêu cầu thuộc loại PUT hoặc POST, nó sẽ thêm các tham số vào yêu cầu dưới dạng thực thể được mã hóa URL.

Tạo một đối tượng RequestBuilder (thuộc loại POST) bằng cách sử dụng post()phương pháp. Và chuyển Uri mà bạn muốn gửi yêu cầu nó làm tham số.

//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

Bước 8 - Đặt đối tượng thực thể thành RequestBuilder

Đặt thực thể nhiều phần đã tạo ở trên thành RequestBuilder bằng cách sử dụng setEntity() phương pháp của RequestBuilder lớp học.

//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);

Bước 9 - Xây dựng HttpUriRequest

Xây dựng một HttpUriRequest yêu cầu đối tượng bằng cách sử dụng build() phương pháp của RequestBuilder lớp học.

//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();

Bước 10 - Thực hiện yêu cầu

Sử dụng execute() , thực hiện yêu cầu được xây dựng ở bước trước (bỏ qua yêu cầu làm tham số cho phương thức này).

//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);

Thí dụ

Ví dụ sau minh họa cách gửi yêu cầu nhiều phần bằng thư viện HttpClient. Trong ví dụ này, chúng tôi đang cố gắng gửi một yêu cầu nhiều phần được hỗ trợ bởi một tệp.

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class MultipartUploadExample {
 
   public static void main(String args[]) throws Exception{

      //Creating CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();
 
      //Creating a file object
      File file = new File("sample.txt");

      //Creating the FileBody object
      FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

      //Creating the MultipartEntityBuilder
      MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

      //Setting the mode
      entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

      //Adding text
      entitybuilder.addTextBody("sample_text", "This is the text part of our file");

      //Adding a file
      entitybuilder.addBinaryBody("image", new File("logo.png"));

      //Building a single entity using the parts
      HttpEntity mutiPartHttpEntity = entitybuilder.build();

      //Building the RequestBuilder request object
      RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

      //Set the entity object to the RequestBuilder
      reqbuilder.setEntity(mutiPartHttpEntity);

      //Building the request
      HttpUriRequest multipartRequest = reqbuilder.build();

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(multipartRequest);

      //Printing the status and the contents of the response
      System.out.println(EntityUtils.toString(httpresponse.getEntity()));
      System.out.println(httpresponse.getStatusLine());
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

{
   "args": {},
   "data": "",
   "files": {
      "image": "data:application/octets66PohrH3IWNk1FzpohfdXPIfv9X3490FGcuXsHn9X0piCwomF/xdgADZ9GsfSyvLYAAAAAE
      lFTkSuQmCC"
   },
   "form": {
      "sample_text": "This is the text part of our file"
   },
   "headers": {
      "Accept-Encoding": "gzip,deflate",
      "Connection": "close",
      "Content-Length": "11104", 
      "Content-Type": "multipart/form-data;
      boundary=UFJbPHT7mTwpVq70LpZgCi5I2nvxd1g-I8Rt",
      "Host": "httpbin.org",
      "User-Agent": "Apache-HttpClient/4.5.6 (Java/1.8.0_91)"
   },
   "json": null,
   "origin": "117.216.245.180",
   "url": "http://httpbin.org/post"
}
HTTP/1.1 200 OK