最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中HttpClient使用方法舉例詳解

 更新時(shí)間:2024年12月13日 10:33:28   作者:一口酥Hac  
這篇文章主要介紹了java中HttpClient使用方法的相關(guān)資料,HttpClient提供了發(fā)送HTTP請求和接收HTTP響應(yīng)的功能,簡化了HTTP通信的處理,減少了對外部庫的依賴,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

概要

Java 11引入了HttpClient作為一個(gè)新的API,用于在Java應(yīng)用程序中進(jìn)行HTTP通信。HttpClient提供了發(fā)送HTTP請求接收HTTP響應(yīng)的功能,并且相比于依賴第三方庫如Apache HttpClient或OkHttp,它提供了一種簡單、一致且更加集成的方式來處理HTTP通信。作為Java的一部分,HttpClient被設(shè)計(jì)成與Java平臺更好地集成,使得開發(fā)者能夠更輕松地處理HTTP請求和響應(yīng),同時(shí)減少了對外部庫的依賴。

HttpClient 的主要類包括:
java.net.http.HttpClient:HttpClient是用于發(fā)送HTTP請求和處理HTTP響應(yīng)的主要類。它提供了一種簡單且一致的方式來執(zhí)行HTTP操作,包括同步和異步的請求發(fā)送、連接池管理、請求和響應(yīng)的攔截器等功能。

java.net.http.HttpRequest:HttpRequest是用于表示HTTP請求的類。通過HttpRequest對象,您可以設(shè)置請求的URL、請求方法、請求頭、請求體等信息,并構(gòu)建一個(gè)完整的HTTP請求對象,用于發(fā)送給服務(wù)器。

java.net.http.HttpResponse:HttpResponse是用于表示HTTP響應(yīng)的類。當(dāng)客戶端發(fā)送HTTP請求后,服務(wù)器會返回一個(gè)HTTP響應(yīng),HttpResponse對象用于表示這個(gè)響應(yīng)。通過HttpResponse對象,您可以獲取響應(yīng)的狀態(tài)碼、響應(yīng)頭、響應(yīng)體等信息,以便進(jìn)一步處理響應(yīng)。

但是,如果你在使用Java 11之前的版本,并且想要使用類似的功能,你可能需要引入第三方庫的依賴,如Apache HttpClient。以下是使用Apache HttpClient的一個(gè)示例依賴項(xiàng):

<!-- Apache HttpClient依賴 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version> 
</dependency>

JDK11 及之后的版本 舉例

第一種以下是一個(gè)簡單的例子,演示如何使用HttpClient發(fā)送GET請求:

    public static void main(String[] args) throws Exception {
        // 創(chuàng)建一個(gè)HttpClient實(shí)例
        HttpClient httpClient = HttpClient.newHttpClient();

        // 創(chuàng)建一個(gè)HTTP請求 指定URI
        HttpRequest httpRequest = HttpRequest.newBuilder()
                .uri(URI.create("https://api.uomg.com/api/rand.qinghua")) // 使用 URI 創(chuàng)建請求
                .build();

        // 發(fā)送 HTTP 請求并獲取響應(yīng)
        HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

        // 輸出響應(yīng)的狀態(tài)碼和響應(yīng)體
        System.out.println("響應(yīng)狀態(tài)碼:" + response.statusCode());
        System.out.println("響應(yīng)體:" + response.body());
    }

第二種以下是一個(gè)示例,演示如何使用sendAsync()方法發(fā)送異步GET請求:

    public static void main(String[] args) {
        HttpClient httpClient = HttpClient.newHttpClient();

        HttpRequest httpRequest = HttpRequest.newBuilder()
                .uri(URI.create("https://api.uomg.com/api/rand.qinghua"))
                .build();

        CompletableFuture<HttpResponse<String>> future = httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString());

        future.thenAccept(response -> {
            System.out.println("響應(yīng)狀態(tài)碼:" + response.statusCode());
            System.out.println("響應(yīng)體:" + response.body());
        }).join();// 等待異步操作完成
    }

第三種
以下是一個(gè)使用HttpClient發(fā)送POST請求的示例代碼:

    public static void main(String[] args) throws Exception {
        // 創(chuàng)建一個(gè) HttpClient 實(shí)例
        HttpClient client = HttpClient.newHttpClient();

        // 構(gòu)建請求體參數(shù)
        Map<String, String> requestBody = new HashMap<>();
        requestBody.put("param1", "value1");
        requestBody.put("param2", "value2");

        // 構(gòu)建 POST 請求
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.uomg.com/api/rand.qinghua"))
                .header("Content-Type", "application/json") // 設(shè)置請求頭
                .POST(buildRequestBody(requestBody)) // 設(shè)置請求體
                .build();

        // 發(fā)送請求并獲取響應(yīng)
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 輸出響應(yīng)碼和響應(yīng)體
        System.out.println("Response Code: " + response.statusCode());
        System.out.println("Response Body: " + response.body());
    }

    // 構(gòu)建請求體
    // buildRequestBody方法的作用是將一個(gè)Map<String, String>類型的數(shù)據(jù)轉(zhuǎn)換為符合JSON格式的字符串
    // 轉(zhuǎn)換后:{"param1":"value1","param2":"value2"}
    private static HttpRequest.BodyPublisher buildRequestBody(Map<String, String> data) {
        StringBuilder builder = new StringBuilder();
        builder.append("{");
        for (Map.Entry<String, String> entry : data.entrySet()) {
            builder.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\",");
        }
        builder.deleteCharAt(builder.length() - 1); // 刪除最后一個(gè)逗號
        builder.append("}");
        return HttpRequest.BodyPublishers.ofString(builder.toString());
    }

JDK11 之前的版本 舉例

第一步引入依賴:

    <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
          <version>4.5.14</version>
    </dependency>

第二步封裝一個(gè)工具類:

public class HttpClientUtil {

    static final int TIMEOUT_MSEC = 5 * 1000;

    /**
     * 發(fā)送GET方式請求
     */
    public static String doGet(String url, Map<String, String> paramMap) {
        // 創(chuàng)建Httpclient對象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String result = "";
        CloseableHttpResponse response = null;

        try {
            URIBuilder builder = new URIBuilder(url);
            if (paramMap != null) {
                for (String key : paramMap.keySet()) {
                    builder.addParameter(key, paramMap.get(key));
                }
            }
            URI uri = builder.build();

            //創(chuàng)建GET請求
            HttpGet httpGet = new HttpGet(uri);

            //發(fā)送請求
            response = httpClient.execute(httpGet);

            //判斷響應(yīng)狀態(tài)
            if (response.getStatusLine().getStatusCode() == 200) {
                result = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    /**
     * 發(fā)送POST方式請求,參數(shù)為鍵值對形式
     */
    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
        // 創(chuàng)建Httpclient對象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 創(chuàng)建Http Post請求
            HttpPost httpPost = new HttpPost(url);

            // 創(chuàng)建參數(shù)列表
            if (paramMap != null) {
                List<NameValuePair> paramList = new ArrayList();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
                }
                // 模擬表單
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }

            // 設(shè)置請求配置
            httpPost.setConfig(builderRequestConfig());

            // 執(zhí)行http請求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }

    /**
     * 發(fā)送POST方式請求,參數(shù)為JSON格式
     */
    public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
        // 創(chuàng)建Httpclient對象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 創(chuàng)建Http Post請求
            HttpPost httpPost = new HttpPost(url);

            if (paramMap != null) {
                //構(gòu)造json格式數(shù)據(jù)
                JSONObject jsonObject = new JSONObject();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    jsonObject.put(param.getKey(), param.getValue());
                }
                StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8");
                //設(shè)置請求編碼
                entity.setContentEncoding("utf-8");
                //設(shè)置數(shù)據(jù)類型
                entity.setContentType("application/json");
                httpPost.setEntity(entity);
            }

            // 設(shè)置請求配置
            httpPost.setConfig(builderRequestConfig());

            // 執(zhí)行http請求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }

    /**
     * 構(gòu)建請求配置
     */
    private static RequestConfig builderRequestConfig() {
        return RequestConfig.custom()
                .setConnectTimeout(TIMEOUT_MSEC) // 設(shè)置連接超時(shí)時(shí)間
                .setConnectionRequestTimeout(TIMEOUT_MSEC) // 設(shè)置從連接池獲取連接的超時(shí)時(shí)間
                .setSocketTimeout(TIMEOUT_MSEC) // 設(shè)置請求獲取數(shù)據(jù)的超時(shí)時(shí)間
                .build();
    }
}

第三步使用這個(gè)工具類:(簡單例子測試一下)

    public static void main(String[] args) {
        String s = HttpClientUtil.doGet("https://api.uomg.com/api/rand.qinghua", null);
        System.out.println(s);
    }

使用JDK11添加如下依賴

<!--JDK11缺少的依賴-->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

小結(jié)

總的來說,HttpClient是一個(gè)功能強(qiáng)大、靈活易用的HTTP客戶端庫,適用于各種Java應(yīng)用程序,如Web應(yīng)用、后臺服務(wù)等,能夠幫助開發(fā)者輕松實(shí)現(xiàn)HTTP通信功能。

到此這篇關(guān)于java中HttpClient使用方法的文章就介紹到這了,更多相關(guān)java中HttpClient使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java普通類、抽象類、接口的應(yīng)用和區(qū)別解析

    Java普通類、抽象類、接口的應(yīng)用和區(qū)別解析

    本文詳細(xì)對比了Java普通類、抽象類和接口的區(qū)別,從定義關(guān)鍵字、繼承或?qū)崿F(xiàn)關(guān)鍵字、成員字段和方法等方面進(jìn)行分析,感興趣的朋友跟隨小編一起看看吧
    2026-06-06
  • java查找文件夾下最新生成的文件的方法

    java查找文件夾下最新生成的文件的方法

    在本篇文章中我們給大家分享了關(guān)于java怎么查找文件夾下最新生成的文件的相關(guān)方法和知識點(diǎn),有需要的朋友們參考下。
    2019-07-07
  • Spring注解驅(qū)動之AOP功能測試

    Spring注解驅(qū)動之AOP功能測試

    這篇文章主要介紹了Spring注解驅(qū)動之AOP功能測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 分享幾個(gè)Java工作中實(shí)用的代碼優(yōu)化技巧

    分享幾個(gè)Java工作中實(shí)用的代碼優(yōu)化技巧

    這篇文章主要給大家分享幾個(gè)Java工作中實(shí)用代碼優(yōu)化技巧,文章基于Java的相關(guān)資料展開對其優(yōu)化技巧的分享,需要的小伙伴可以參考一下
    2022-04-04
  • 淺析Java如何防范SQL注入攻擊

    淺析Java如何防范SQL注入攻擊

    這篇文章主要為大家詳細(xì)介紹了SQL注入漏洞的原理,表現(xiàn)形式以及如何防范這種攻擊,文中的示例代碼講解詳細(xì),希望可以幫助開發(fā)者構(gòu)建更安全的Java應(yīng)用
    2025-05-05
  • 聊聊Redis的單線程模型

    聊聊Redis的單線程模型

    Redis是單線程,主要是指Redis的網(wǎng)絡(luò)IO和讀寫是由一個(gè)線程來完成的,但Redis的其他功能,比如持久化、異步刪除、集群數(shù)據(jù)同步等,其實(shí)是由額外的線程執(zhí)行的。這不是本文討論的重點(diǎn),有個(gè)印象即可
    2022-12-12
  • SpringBoot集成Nacos的實(shí)戰(zhàn)完全指南

    SpringBoot集成Nacos的實(shí)戰(zhàn)完全指南

    Nacos?作為阿里巴巴開源的一站式微服務(wù)管理平臺,已成為?Spring?Cloud?Alibaba?生態(tài)的核心組件,本文基于?Spring?Boot?3.x?+?Nacos?2.x?最新版本,系統(tǒng)講解?Nacos?的安裝部署、配置中心、服務(wù)發(fā)現(xiàn)等核心功能,并提供生產(chǎn)級最佳實(shí)踐方案,有需要的小伙伴可以了解下
    2026-02-02
  • SpringBoot整合minio快速入門教程(代碼示例)

    SpringBoot整合minio快速入門教程(代碼示例)

    這篇文章主要介紹了SpringBoot整合minio快速入門實(shí)現(xiàn)文件上傳和下載的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實(shí)現(xiàn)

    SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java Web編程之Servlet技術(shù)詳解

    Java Web編程之Servlet技術(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了Java Web編程之Servlet技術(shù),Servlet就是一種實(shí)現(xiàn)了Servlet接口的類,它由Web容器(Tomcat/Jetty等)負(fù)責(zé)調(diào)用并創(chuàng)建,用于接收和響應(yīng)用戶請求,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論

谷城县| 灌南县| 商丘市| 抚州市| 独山县| 图木舒克市| 凤城市| 怀集县| 玉山县| 临泉县| 广丰县| 新疆| 胶南市| 康平县| 图木舒克市| 南汇区| 阜新| 康马县| 博白县| 茂名市| 玉环县| 辽阳县| 平乐县| 蒙城县| 勐海县| 上蔡县| 布拖县| 康保县| 嘉定区| 长沙县| 福泉市| 德清县| 大埔县| 庆阳市| 郯城县| 潢川县| 阳春市| 扶绥县| 西贡区| 合江县| 申扎县|