httpclient

news2024/11/24 22:28:26

1.什么是httpclient

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

2.http请求(结合spring的注解)

2-1GET请求

添加添加@PathVariable  带占位符的 URL 

添加@RequestParam  将请求参数区域的数据(url中参数)映射到控制层方法的参数上

2-2 POST请求

添加@RequestBody  JSON传参

 2-3.PUT请求

添加@RequestBody  JSON传参

  2-4DELETE

添加@RequestBody  JSON传参

 

3.导入相关依赖

lombok 和fastjson方便对数据进行处理

 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.46</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

 4.准备工作

在使用这个框架之前你需要明白 请求的组成部分 

 1.请求报文(请求行/请求头/请求数据/空行)

        请求行

            求方法字段、URL字段和HTTP协议版本

            例如:GET /index.html HTTP/1.1

                get方法将数据拼接在url后面,传递参数受限

            请求方法:

                GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT

        请求头(key value形式)

            User-Agent:产生请求的浏览器类型。

            Accept:客户端可识别的内容类型列表。

            Host:主机地址

        请求数据

            post方法中,会把数据以key value形式发送请求

        空行

            发送回车符和换行符,通知服务器以下不再有请求头

    2.响应报文(状态行、消息报头、响应正文)

        状态行

        消息报头

        响应正文

请求头一般我们需要设置User-Agent,content-type 以及cookie  ,我们要的数据都存放在响应体内

5.创建HttpClients实例

创建HttpClients实例你可以理解为打开一个浏览器,发送请求 点开这个类

 5-1custom

为构造自定义CloseableHttpClient实例创建构建器对象。


public class Test01 {

    public static void main(String[] args) {

        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(httpUtils()).build();


    }
    //设置连接池
    public static PoolingHttpClientConnectionManager httpUtils() {
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(200);  //最大连接数
        cm.setDefaultMaxPerRoute(20);    //设置每个主机的并发数
        return cm;
    }



}

5-2createDefault

使用默认配置的实例。默认的无法设置连接池

6.设置请求

6-1不带参数  

 6-2带参数

假设路径为 http://localhost:8081/?id=2 , 这里的id就是字段名,2就是字段的值,我们直接

发送请求只会有http://localhost:8081/,现在我就是有吧参数带进去

        //get请求
        String url = "http://localhost:8081/";
        URI build = new URIBuilder(url).addParameter("id", "2").build();
        HttpGet httpGet = new HttpGet(build.toString());
        

        //post请求 form-data 表单提交
        HttpPost httpPost = new HttpPost(url);//
        List<NameValuePair> paramList = new ArrayList<NameValuePair>();
        paramList.add(new BasicNameValuePair("id","2"));
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
        httpPost.setEntity(entity);

        //post请求json表单
        HashMap<String, String> param = new HashMap<>();
        param.put("id", "2");
        // 创建Http Post请求
        HttpPost httpPost1 = new HttpPost(url);
        // 创建请求内容
        String json = JSONObject.toJSON(param).toString();
        // 设置参数为Json,模拟表单
        StringEntity entity1 = new StringEntity(json, ContentType.APPLICATION_JSON);
        // 把参数赋值给请求
        httpPost1.setEntity(entity);

7.设置请求头

token也是在请求头中 ,可以直接设置  以get请求为列

  String url = "http://localhost:8081/";
        URI build = new URIBuilder(url).addParameter("id", "2").build();
        HttpGet httpGet = new HttpGet(build.toString());
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                + "Chrome/104.0.0.0 Safari/537.36");
        httpGet.setHeader("content-type", "application/json");
        //假设tokeen:xsxsxs
        httpGet.setHeader("X-Access-Token", "xsxsxs");

 8.请求设置

   httpGet.setConfig(getConfig());
        

    }

    /**
     * @return 请求设置
     */
    private static RequestConfig getConfig() {
        //配置请求信息
        RequestConfig config = RequestConfig.custom().setConnectTimeout(1000000000)//创建连接最大时间,
                .setConnectionRequestTimeout(500000000)  // 设置获取连接的最长时间 ,单位是毫秒
                .setSocketTimeout(10 * 100000)     //设置传输的最长时间,单位是毫秒
                .build();
        return config;
    }

9.设置代理

 //设置代理
        HttpHost proxy = new HttpHost("58.60.255.82",8118);
        RequestConfig requestConfig = RequestConfig.custom()
                .setProxy(proxy)
                .setConnectTimeout(10000)
                .setSocketTimeout(10000)
                .setConnectionRequestTimeout(3000)
                .build();
        httpGet.setConfig(requestConfig);

 10.工具类

我这里没有设置请求头,也没有设置请求,代码也没有设置,主要展示带参数的

package com.example.list.list;


import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpHost;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class HttpClientUtils {


    /**
     * @return 请求设置
     */
    private  RequestConfig getConfig(HttpHost proxy) {
        //配置请求信息
        RequestConfig config = RequestConfig.custom()
                .setConnectTimeout(1000000000)//创建连接最大时间,
                .setConnectionRequestTimeout(500000000)  // 设置获取连接的最长时间 ,单位是毫秒
                .setSocketTimeout(10 * 100000)     //设置传输的最长时间,单位是毫秒
                .setProxy(proxy)
                .build();
        return config;
    }

    /**
     * get 请求带参数
     *
     * @param url
     * @param param
     * @return
     */
    public Object doGet(String url, Map<String, String> param) {

        //创建HttpClient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        //返回的字符串
        String resultString = "";
        JSONObject jsonObject = new JSONObject();
        CloseableHttpResponse response = null;
        try {
            //创建url
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            //创建get请求
            HttpGet httpGet = new HttpGet(builder.toString());
            // 执行请求
            response = httpclient.execute(httpGet);
            //判断返回值是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
            //将字符串转JSONObject(可以获取里面得某个元素),也可以直接返回字符串
            jsonObject = JSONObject.parseObject(resultString);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    //设置连接池
    public  PoolingHttpClientConnectionManager httpUtils() {
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(200);  //最大连接数
        cm.setDefaultMaxPerRoute(20);    //设置每个主机的并发数
        return cm;
    }

    /**
     * form表单 post请求
     *
     * @param url
     * @param param
     * @return
     */
    public  String doPost(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建参数列表
            if (param != null) {
                List<NameValuePair> paramList = new ArrayList<NameValuePair>();
                for (String key : param.keySet()) {
                    paramList.add(new BasicNameValuePair(key, param.get(key)));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }
            // 执行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;
    }

    /**
     * post设置参数json
     *
     * @param url
     * @param param
     * @return
     */
    public  String doPostJson(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建请求内容
            String json = JSONObject.toJSON(param).toString();
            // 设置参数为Json,模拟表单
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            // 把参数赋值给请求
            httpPost.setEntity(entity);
            // 执行http请求
            response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "utf-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }


}

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

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

相关文章

相对位置编码之RPR式:《Self-Attention with Relative Position Representations》论文笔记

&#x1f604; 额&#xff0c;本想学学XLNet的&#xff0c;然后XLNet又是以transformer-XL为主要结构&#xff0c;然后transformer-XL做了两个改进&#xff1a;一个是结构上做了segment-level的循环机制&#xff0c;一个是在attention机制里引入了相对位置编码信息来避免不同se…

AutoCAD Electrical 2022—源箭头和目标箭头

在一张图纸上插入源 箭头&#xff1b; 选中一根导线&#xff1b; 如果源和目标在同一张图纸上&#xff0c;则可以点击确定&#xff0c;插入目标箭头&#xff1b; 如果不在同一张图纸上&#xff0c;则点击否&#xff0c;后面在插入目标箭头&#xff1b; 在另一张图纸上插入目标…

学习笔记:引用

概念 引用的作用是给一个变量起别名 格式&#xff1a; type & 别名 原名 引用必须初始化&#xff0c;在初始化后不能改变 int &b;ba;错误 int& b a; bc;不是将b从a的别名变为c的别名 而是将c的值赋给a int a 10; int& b a; b 20;//用别名改数据&…

Apifox:详细使用教程,带你轻松拿捏

目录 Apifox简介 Apifox的安装与使用 Apifox新建项目的流程 编写接口文档 Apifox简介 我们在日常编程开发过程中经常实行的是前后端分离架构的模式&#xff0c;一个项目的落地会通过产品、开发、测试三方会审&#xff0c;对项目需求评审过后&#xff0c;前后端开发会制定一…

基于SpringBoot医院信息管理系统源码

hisystem 1. 用idea打开项目&#xff0c;并且配置maven下载依赖 2. 导入数据库 hisystem.sql 3. 修改application.yml数据库相关配置 4. 用户注册&#xff0c;验证邮件的邮箱考虑到安全问题&#xff0c;暂不提供授权码&#xff0c;如有需求可使用自己邮箱&#xff0c;开启POP3…

Vue3 - 路由 Vue-router 4.X(配置与使用教程)

目录前言安装配置准备工作配置路由基本使用路由传参 1路由传参 2路由传参 3SEO前言 在咱们 Vue2 时代&#xff0c;官方推荐咱们使用 vue-router 3.X 的库&#xff0c;如果是用脚手架创建的话&#xff0c;就直接默认集成到里面了。 Vue3 使用的是 vue-router 4.X 官方库&#xf…

[附源码]计算机毕业设计JAVA小超市进销存管理系统

[附源码]计算机毕业设计JAVA小超市进销存管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

m扩频通信系统在瑞利信道中的误码率性能matlab仿真

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本课题&#xff0c;我们主要涉及到两个理论要点&#xff0c;第一个是瑞利衰落条件&#xff0c;第二个是扩频通信。下面分别对这两个理论进行介绍&#xff1a; 第一个是瑞利衰落条件&#x…

我们又重写了一个关键服务

#01 QueryCoord 组件介绍 QueryCoord 是 Milvus 中查询集群的中心调度节点&#xff0c;在用户将一个 Collection Load 到内存中时&#xff0c;QueryCoord 负责将该 Collection 的 Segment 调度到 QueryNode 集群中&#xff0c;以支持后续的查询。 QueryCoord 最核心的操作有4…

将egg项目部署至服务器

文章目录1.下载linux版本的node-v162.将node安装包从自己电脑上上传到自己的服务器3.在服务器中解压压缩包4.配置环境变量5.使文件生效6.将egg项目传到服务器指定目录下7.下载依赖8.npm start 运行不会占用终端 并且一直在运行 可以使用npm stop停用9.最后使用云服务器ip:端口号…

Linux22 --- 网络为什么要分层、使用tcp协议实现两个进程间通信的功能、IP地址转换函数

一、网络为什么要分层 1 1、分层的优点 1&#xff09;各层之间是独立的。某一层并不需要知道它的下一层是如何实现的&#xff0c;而仅仅需要知道该层通过层间的接口&#xff08;即界面&#xff09;所提供的服务。由于每一层只实现一种相对独立的功能&#xff0c;因而可将一个…

Linux-Hadoop集群配置

文章目录一、配置Hadoop集群1、在master虚拟机上配置hadoop&#xff08;1&#xff09;编辑Hadoop环境配置文件 - hadoop-env.sh&#xff08;2&#xff09;编辑Hadoop核心配置文件 - core-site.xml&#xff08;3&#xff09;编辑HDFS配置文件 - hdfs-site.xml&#xff08;4&…

1542_AURIX_TC275_CPU子系统_内核

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 我因为看了这个章节的开篇有些疑惑去看了内核手册&#xff0c;现在学习的进程终于又重新回归&#xff0c;回到了TC275这个MCU的学习上。 这里的几条笔记记录是隔了很久写的&#xff0c;前面…

【Java面试】HashMap死循环问题

问题 最近几道面试题被问了是否了解并发情况下JDK7中HashMap发生死循环&#xff0c;导致CPU占用100%的问题。 由于HashMap并非是线程安全的&#xff0c;所以在高并发的情况下必然会出现问题&#xff0c;这是一个普遍的问题。 如果是在单线程下使用HashMap&#xff0c;自然是没…

[MAUI] 开篇-初识MAUI

前言 在2020年5月, 微软宣布了MAUI跨平台框架, MAUI 是Xamarin.Forms演变而来, 这也就意味着, 如果你原来具备Xamarin.Forms开发经验, 你可以流畅的过渡到MAUI开发当中。 原本于2021年底发布的MAUI正式版被推迟到了2022年5月底发布。现在, 你目前可以通过安装VS2022 预览版进行…

Elasticsearch倒排索引

什么是正排索引&#xff1f; 如下图&#xff0c;有一张商品表&#xff08;tb_goods&#xff09;&#xff1a; 对于mysql数据库来说&#xff0c;肯定会给“id”创建主键索引&#xff0c;然后根据“id”来查询对应的商品信息&#xff0c;而这种情况就被称为“正排索引” 现在有…

eMagin:当月产百万片时,4K MicroOLED成本将不是问题

在今年2022 SID显示周期间&#xff0c;Micro OLED微显示模组厂商eMagin曾展示一款专为超短焦VR头显开发的4K Micro OLED微显示屏&#xff0c;有趣的是&#xff0c;该显示屏连接的主板上印有STEAMBOAT字样&#xff0c;让人不禁怀疑它与Valve之间是否存在某种联系。甚至有猜测认为…

【Linux】8.0 多线程

文章目录1.0 Linux线程概念1.1 Linux线程基本概念1.2 Linux线程优劣介绍2.0 Linux线程控制2.1 pthread_create(创建线程)2.2 pthread_join(线程等待)2.3 pthread_exit(线程终止)2.4 pthread_detach(线程分离)3.0 线程id和LWP的关系4.0 Linux线程互斥4.1 线程互斥相关概念4.2 线…

JUC系列(五) 读写锁与阻塞队列

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

Qt第二十六章:Nuitka打包教程

Nuitka环境安装 ①下载gcc文件。提取码&#xff1a;8888百度网盘 请输入提取码 ②解压nuitka1.0.6版本&#xff0c;我们解压64位的。 ③设置环境变量 ④检测一下 gcc.exe --version 安装nuitka pip install nuitka pip install ordered-set 防止环境变量不生效&#xff0c;…