jdk 11 自带的HttpClient

news2024/11/16 19:36:54

jdk 11 自带的HttpClient

文章目录

  • jdk 11 自带的HttpClient
    • 步骤1:创建jdk HttpClient 对象
    • 步骤2:创建请求
    • 步骤3:使用client.sent()发送同步请求
    • 步骤4:处理响应
    • 下面是发送post请求,请求类型是json,使用client.sent()发送**异步**请求
    • 完整示例:不用改,可以直接用
    • 武林秘籍:

在这里插入图片描述

步骤1:创建jdk HttpClient 对象

 /**
     * 创建jdk HttpClient 对象
     *
     * @return
     */
    public static HttpClient getHttpClient() {
        return HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_1_1)
                .followRedirects(HttpClient.Redirect.NORMAL)
                //连接超时时间
                .connectTimeout(Duration.ofSeconds(20))
                .proxy(ProxySelector.getDefault())
                //.executor()
                .build();
    }

步骤2:创建请求


    /**
     * 描述:创建请求
     * get请求不带参数、get请求带参数,
     * post请求不带参数、post请求带参数
     * 都可以用该方法
     *
     * @param method {@link JdkHttpClientUtil#GET,JdkHttpClientUtil#POST}
     * @param uri    请求地址
     * @param query  查询字符串 如 ie=utf-8&csq=1 或者json字符串
     * @param header 请求头数组 如:<pre> String[] header=new String[]
     *  {"token1Name","token1Val","token2Name","token2Val"};<pre/>
     */
    public static HttpRequest getOrPostHttpRequest(String method, String uri, String query, String[] header) {
        final HttpRequest.Builder builder = HttpRequest.newBuilder().uri(URI.create(uri));
        // 判断是否有请求头参数header
        if (header != null && header.length >= 0) {
            builder.headers(header);
        }

        return
                builder
                        //判断是否有查询参数
                        .method(method, (query == null || query == "") ? HttpRequest.BodyPublishers.noBody() :
                                 HttpRequest.BodyPublishers.ofString(query, StandardCharsets.UTF_8)
                                //这两种方法都ok
                               // HttpRequest.BodyPublishers.ofByteArray(query.getBytes())
                        )
                        //读取超时时间
                        .timeout(Duration.ofMinutes(2)).build();
    }

步骤3:使用client.sent()发送同步请求

//3.发送请求
        final HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));

步骤4:处理响应

        //4.处理响应
        final int statusCode = response.statusCode();
        final String responseBody = response.body();
        System.out.println("返回状态码是:" + statusCode);
        System.out.println(responseBody);

下面是发送post请求,请求类型是json,使用client.sent()发送异步请求

 //下面是发送post 请求,请求类型为json ,希望接收json
        final String uri2 = "https://www2.deepl.com/jsonrpc?method=LMT_split_text";
        String queryJson = "{\"jsonrpc\":\"2.0\",\"method\": \"LMT_split_text\",\"params\":{\"texts\":[\"followRedirects\"],\"commonJobParams\":{\"mode\":\"translate\"},\"lang\":{\"lang_user_selected\":\"EN\",\"preference\":{\"weight\":{\"DE\":0.19473,\"EN\":24.18327,\"ES\":0.1889,\"FR\":0.29868,\"IT\":0.13393,\"JA\":0.07362,\"NL\":0.36924,\"PL\":0.17236,\"PT\":0.11651,\"RU\":0.04533,\"ZH\":1.60654,\"BG\":0.0363,\"CS\":0.12581,\"DA\":0.21426,\"EL\":0.04046,\"ET\":0.14302,\"FI\":0.07996,\"HU\":0.07409,\"LT\":0.06742,\"LV\":0.04943,\"RO\":0.07113,\"SK\":0.12092,\"SL\":0.04123,\"SV\":0.29803,\"TR\":0.0578,\"ID\":0.0757,\"UK\":0.03858},\"default\":\"default\"}}},\"id\":13070003}";

        String[] header2=new String[]{"content-type","application/json","Accept", "application/json" };

        HttpRequest request2 = getOrPostHttpRequest(JdkHttpClientUtil.POST, uri2, queryJson, header2);
        //client.sendAsync 发送异步方法
        final CompletableFuture<HttpResponse<String>> future = client.sendAsync(request2, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        final HttpResponse<String> response2 = future.get();
        //4.处理响应
        final int statusCode2 = response2.statusCode();
        final String responseBody2 = response2.body();
        System.out.println("返回状态码是:" + statusCode2);
        System.out.println(responseBody2);

在这里插入图片描述

完整示例:不用改,可以直接用

import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.concurrent.CompletableFuture;

/**
 *  JdkHttpClientUtil 类所有的方法 都是jdk11 自带的
 *
 *  HttpRequest.BodyPublishers 用于处理请求参数,如:是以字符串传送,还是按字节
 *  HttpResponse.BodyHandlers  用于处理响应体,如:是处理成响应文本,还是处理成响应流
 *
 *  武林秘籍:https://openjdk.org/groups/net/httpclient/recipes.htm
 */
public class JdkHttpClientUtil {
    public static final String GET = "GET";
    public static final String POST = "POST";

    public static void main(String[] args) throws Exception {
        // 1. 创建jdk HttpClient 对象
        HttpClient client = getHttpClient();
        // final String uri = "https://www.baidu.com";
        // HttpRequest request = getHttpRequest(uri);

        // 2. 构建HttpRequest请求对象
        final String uri = "https://www.baidu.com/s";
        String query = "ie=utf-8&csq=1&pstg=20&mod=2&isbd=1&cqid=b6d9801e00080d0a&istc=886&ver=Rt5bJQkDOb0aje7jof0Un39Z1rBzXCmLDoO&chk=638a2e8a&isid=EF1ABC098AE51628&ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=HttpClient&ct=2097152&si=oracle.com&oq=Http%2526lt%253Blient&rsv_pq=aeab00610008ae59&rsv_t=0be6mAUUmhf6O8ehMCFN6anJ71ZkKAEAIKGmiCqHQbETtQ95Cv8pth6IPnw&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_btype=t&bs=HttpClient&f4s=1&_ck=1886.1.86.79.22.804.37&isnop=0&rsv_stat=-2&rsv_bp=1";
        HttpRequest request = getOrPostHttpRequest(JdkHttpClientUtil.GET, uri, query, null);

        //3.发送请求
        final HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        //4.处理响应
        final int statusCode = response.statusCode();
        final String responseBody = response.body();
        System.out.println("返回状态码是:" + statusCode);
        System.out.println(responseBody);

        //下面是发送post 请求,请求类型为json ,希望接收json
        final String uri2 = "https://www2.deepl.com/jsonrpc?method=LMT_split_text";
        String queryJson = "{\"jsonrpc\":\"2.0\",\"method\": \"LMT_split_text\",\"params\":{\"texts\":[\"followRedirects\"],\"commonJobParams\":{\"mode\":\"translate\"},\"lang\":{\"lang_user_selected\":\"EN\",\"preference\":{\"weight\":{\"DE\":0.19473,\"EN\":24.18327,\"ES\":0.1889,\"FR\":0.29868,\"IT\":0.13393,\"JA\":0.07362,\"NL\":0.36924,\"PL\":0.17236,\"PT\":0.11651,\"RU\":0.04533,\"ZH\":1.60654,\"BG\":0.0363,\"CS\":0.12581,\"DA\":0.21426,\"EL\":0.04046,\"ET\":0.14302,\"FI\":0.07996,\"HU\":0.07409,\"LT\":0.06742,\"LV\":0.04943,\"RO\":0.07113,\"SK\":0.12092,\"SL\":0.04123,\"SV\":0.29803,\"TR\":0.0578,\"ID\":0.0757,\"UK\":0.03858},\"default\":\"default\"}}},\"id\":13070003}";

        String[] header2=new String[]{"content-type","application/json","Accept", "application/json" };

        HttpRequest request2 = getOrPostHttpRequest(JdkHttpClientUtil.POST, uri2, queryJson, header2);
        //client.sendAsync 发送异步方法
        final CompletableFuture<HttpResponse<String>> future = client.sendAsync(request2, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        final HttpResponse<String> response2 = future.get();
        //4.处理响应
        final int statusCode2 = response2.statusCode();
        final String responseBody2 = response2.body();
        System.out.println("返回状态码是:" + statusCode2);
        System.out.println(responseBody2);

    }

    /**
     * get请求无参
     * @param uri
     * @return
     */
    public static HttpRequest getHttpRequest(String uri) {
        return HttpRequest.newBuilder()
                .uri(URI.create(uri))
                //读取超时时间
                .timeout(Duration.ofMinutes(2)).GET().build();
    }

    /**
     * 描述:创建请求
     * get请求不带参数、get请求带参数,
     * post请求不带参数、post请求带参数
     * 都可以用该方法
     *
     * @param method {@link JdkHttpClientUtil#GET,JdkHttpClientUtil#POST}
     * @param uri    请求地址
     * @param query  查询字符串 如 ie=utf-8&csq=1 或者json字符串
     * @param header 请求头数组 如:<pre>String[] header=new String[]{"token1Name","token1Val","token2Name","token2Val"};<pre/>
     *               @return
     */
    public static HttpRequest getOrPostHttpRequest(String method, String uri, String query, String[] header) {
        final HttpRequest.Builder builder = HttpRequest.newBuilder().uri(URI.create(uri));
        // 判断是否有请求头参数header
        if (header != null && header.length >= 0) {
            builder.headers(header);
        }

        return
                builder
                        //判断是否有查询参数
                        .method(method, (query == null || query == "") ? HttpRequest.BodyPublishers.noBody() :
                                 HttpRequest.BodyPublishers.ofString(query, StandardCharsets.UTF_8)
                                //这两种方法都ok
                               // HttpRequest.BodyPublishers.ofByteArray(query.getBytes())
                        )
                        //读取超时时间
                        .timeout(Duration.ofMinutes(2)).build();
    }

    /**
     * 创建jdk HttpClient 对象
     *
     * @return
     */
    public static HttpClient getHttpClient() {
        return HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_1_1)
                .followRedirects(HttpClient.Redirect.NORMAL)
                //连接超时时间
                .connectTimeout(Duration.ofSeconds(20))
                .proxy(ProxySelector.getDefault())
                //.executor()
                .build();
    }
}

武林秘籍:

https://openjdk.org/groups/net/httpclient/recipes.htm

学到了就要教人,赚到了就要给人,开源精神,资源共享 resource sharing!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇智动力《软件测试课程V8.0版本》正式发布!

今年是汇智动力建校的第八个年头&#xff0c;这一路走来&#xff0c;我们始终抓住时代的机遇与发展同辉、与时代俱兴&#xff0c;助力千万学子圆梦互联网。时代在飞速发展&#xff0c;社会在不断进步&#xff0c;为了使汇智学子适应科技变化的需要&#xff0c;汇智动力《软件测…

限量版Spring实战笔记与其在收藏里吃灰,不如大家一起学习,欸 大家一起卷!

写在前面 作为一个java程序员&#xff0c;spring应该都不会陌生了吧&#xff1f; 对于大部分程序员来说&#xff0c;spring的入门&#xff0c;估计跑起一个框架&#xff0c;熟悉一下开发的流程&#xff0c;基本上就掌握spring框架的开发了。 随着开发年限的变大&#xff0c;我…

解决Netty那些事儿之Reactor在Netty中的实现(创建篇)-下

接上文解决Netty那些事儿之Reactor在Netty中的实现(创建篇)-上 Netty对JDK NIO 原生Selector的优化 首先在NioEventLoop中有一个Selector优化开关DISABLE_KEY_SET_OPTIMIZATION,通过系统变量-D io.netty.noKeySetOptimization指定&#xff0c;默认是开启的&#xff0c;表示需…

[附源码]计算机毕业设计疫情防控平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV-Python】教程:3-14 Hough 圆变换

OpenCV Python Hough 圆变换 【目标】 学习用 Hough 变换检测圆cv2.HoughCircles() 【理论】 圆的数学表达式是 (x−xcenter)2(y−ycenter)2r2(x-x_{center})^2 (y-y_{center})^2 r^2 (x−xcenter​)2(y−ycenter​)2r2 其中 (xcenter,ycenter)(x_{center}, y_{center})…

[附源码]计算机毕业设计志愿者服务平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

matlab测量计算信号的相似度

本示例说明如何测量信号相似度。最近我们被客户要求撰写关于计算信号的相似度的研究报告&#xff0c;包括一些图形和统计输出。 将回答以下问题&#xff1a;如何比较具有不同长度或不同采样率的信号&#xff1f;如何确定测量中是否存在信号或仅有噪声&#xff1f;有两个信号…

校园论坛(Java)—— 考研学习模块

校园论坛&#xff08;Java&#xff09;—— 考研学习模块 文章目录校园论坛&#xff08;Java&#xff09;—— 考研学习模块1、写在前面2、系统结构设计2.1 各个页面之间的调用关系2.2. 登录注册模块各层的设计3、考研学习模块设计3.1 浏览和查看帖子3.2 发表帖子3.3 删除帖子3…

GJB 5000B二级-CM配置管理

主要变化情况 继承3条、修订3条 一、修订的主要内容 CM2.2 建立并维护配置管理系统(SP1.2:建立配置管理系统). 实践陈述:建立并维护配置管理系统和管理规程,建立多级控制机制,实现对已标识配置项的存储、检索、访问控制、变更控制、备份和恢复; CM2.4:跟踪和控制变更…

数据结构-难点突破(C++实现图的基本操作(邻接矩阵,邻接表,十字链表法储存代码))

关于图的数据结构&#xff0c;我曾经自己学过一部分&#xff0c;图论专栏&#xff0c;但是学习本就是重复的过程&#xff0c;这里打算系统的学习一下图。第一步当然是图的储存和基本操作的实现。 要用C实现图的基本操作 Adjacent(x&#xff0c;y)&#xff1a;判断图是否存在边…

[附源码]Python计算机毕业设计Django健康医疗体检

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]计算机毕业设计JAVA校园闲置物品交易

[附源码]计算机毕业设计JAVA校园闲置物品交易 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

第十五章 如何编写README文档

README 文档对于开源项目的重要性甚至会超过代码本身。你试想一下&#xff0c;你打开一个 Github 项目&#xff0c;第一时间就会看到 README 文档&#xff0c;而这时候同一类的项目你可能有很多选择&#xff0c;如果这个README不正规&#xff0c;无法快速上手&#xff0c;你可能…

4.springboot中整合Mybatis

Springboot整合mybatis 在 SpringSpringMVC 中整合 MyBatis 步骤需要在配置文件里配置多个 Bean&#xff0c;比如MapperScannerConfigurer&#xff0c;SqlSessionFactoryBean 等&#xff0c;步骤还是比较复杂的&#xff0c;Spring Boot 中对此做了进一步的简化&#xff0c;使 …

GIS工具maptalks开发手册(三)03——官网示例之添加图层和移除图层

GIS工具maptalks开发手册(三)03——官网示例之添加图层和移除图层 效果 代码 index.html <!DOCTYPE html> <html> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1"> <ti…

Android系统启动流程

Android系统完整的启动过程&#xff0c;从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段&#xff1b;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤&#xff0c;下面就从具体的细节来解读 Android 系统完整的初始化过程。 Lo…

java计算机毕业设计基于springboot电商项目(附源码讲解)

目录 1. 用户端 1.1 主页&#xff08;未登录时可以查看商品但是不可以购买&#xff09; 1.2 登录&#xff08;账号密码登录) 1.3 登录&#xff08;手机验证码登录&#xff09; 1.4 注册 1.5 查看商品详情 1.6 将商品加入购物车 1.7 在商品购物车中选中商品购买 1.8 …

Jenkins用户权限配置 (三)

平时开发会分为测试环境、生产环境&#xff0c;多个开发人员需要区分不同的权限。例如普通开发人员只能看到测试视图和发布测试环境&#xff0c;生产环境的发布则由负责把控的人员进行统一发布&#xff0c;所以需要在新建用户的同时也分配好权限 (一) 安装Role-based Authoriz…

基于C#的公交充值管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做C#程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问题…

利用SCRM进行精细化社群运营

有很多企业凭借私域模式获得爆发式的流量增长&#xff0c;但流量转化仍旧是个问题&#xff0c;因此企业在获得流量的同时&#xff0c;还要守住流量&#xff0c;进行精细化运营才行。 前言 近年来&#xff0c;私域、社群、裂变的模式已成为各行各业进行营销的主旋律&#xff0c…