httpclient

news/2024/4/27 19:33:15/文章来源:https://blog.csdn.net/qq_42847719/article/details/128106182

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:xsxsxshttpGet.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 {//创建urlURIBuilder 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);//判断返回值是否为200if (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.luyixian.cn/news_show_228029.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TStor OneCOS 技术专栏——轻松单桶万亿

TStor OneCOS简介 TStor OneCOS海量对象存储&#xff08;后面简称OneCOS&#xff09;&#xff0c;是基于腾讯云公有云存储架构打造的完全自研的分布式软件定义存储&#xff0c;轻松支持单桶万亿对象和EB级容量&#xff0c;集群容量无限伸缩&#xff0c;同时支持高密大盘等多种…

STL的常用算法-查找 (20221130)

STL的常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;涉及比较、交换、查找、遍历等等&#xff1b; <functional>定义了一些模板类&#xff0…

如何设计可扩展架构

架构设计复杂度模型 业务复杂度和质量复杂度是正交的 业务复杂度 业务固有的复杂度&#xff0c;主要体现为难以理解、难以扩展&#xff0c;例如服务数量多、业务流程长、业务之间关系复杂 质量复杂度 高性能、高可用、成本、安全等质量属性的要求 架构复杂度应对之道 复杂…

野火FPGA进阶(2):基于I2C协议的EEPROM驱动控制

文章目录第49讲&#xff1a;基于I2C协议的EEPROM驱动控制理论部分设计与实现i2c_ctrli2c_rw_dataeeprom_byte_rd_wrtb_eeprom_byte_rd_wr第49讲&#xff1a;基于I2C协议的EEPROM驱动控制 理论部分 I2C通讯协议&#xff08;Inter-Integrated Circuit&#xff09;是由Philips公…

改革后IB数学该如何选?

IB数学&#xff0c;作为一个IB课程里必选科目&#xff0c;让无数IB学霸为之自豪&#xff0c;他们能解出外教都不会做的题。另一方面&#xff0c;也让很多同学&#xff08;自称“学渣”&#xff09;避之不及。 从2019年起&#xff0c;IB数学教学大纲发生重大改革。▲图源&#x…

C语言详细知识点(下)

⛄️上一篇⛄️C语言详细知识点&#xff08;上&#xff09; 文章目录五、数组1、一维数组的定义及使用2、二维数组的定义及使用3、字符数组的定义及使用六、函数1、函数的定义2、函数的调用3、函数的声明4、函数的嵌套调用5、函数的递归调用七、指针1、什么是指针2、指针变量3、…

链表之反转链表

文章目录链表之反转链表题目描述解题思路代码实现链表之反转链表 力扣链接 题目描述 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例&#xff1a; ​ 输入: 1->2->3->4->5->NULL ​ 输出: 5->4-&…

基于vue项目的代码优化

前言 项目上线后其整体性能的优良是用户也是研发人员所关注的。项目优化非常重要&#xff0c;一丝一毫的提升都是对用户的负责。因此我们在开发中就应该注重细节&#xff0c;优化工作从日常开发做起。本篇文章就分享一些在日常开发中代码层面的优化手段。 开发常用优化手段 …

达摩院快速动作识别TPS ECCV论文深入解读

一、论文&代码 论文&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136630615.pdf 模型&代码&#xff1a;ModelScope 魔搭社区 二、背景 高效的时空建模(Spatiotemporal modeling)是视频理解和动作识别的核心问题。相较于图像的Transforme…

开源共建 | TIS整合数据同步工具ChunJun,携手完善开源生态

TIS整合ChunJun实操 B站视频&#xff1a; https://www.bilibili.com/video/BV1QM411z7w5/?spm_id_from333.999.0.0 一、ChunJun 概述 ChunJun是一款易用、稳定、高效的批流统一的数据集成框架&#xff0c;可基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算&…

flink学习

Flink学习之路&#xff08;一&#xff09;Flink简介 - 走看看 Flink(一)-基本概念 - 知乎 Flink架构&#xff1a; Flink整个系统包含三个部分&#xff1a; 1、Client&#xff1a; 给用户提供向Flink系统提交用户任务&#xff08;流式作业&#xff09;的能力。用户提交一个F…

全球无人驾驶大洗牌,百度Apollo Day宣告Robotaxi进入2.0时代

作者 | 德新 编辑 | 王博1. 全球无人驾驶大洗牌&#xff0c;Robotaxi越发向头部聚集 全球无人驾驶落地正呈现两幅面孔。随着资本热潮褪去&#xff0c;一部分公司在资金和研发上已经难以为继&#xff0c;Robotaxi落地的资源和希望&#xff0c;正无限向头部公司聚集。 10月&#…

OVS DPDK VXLAN隧道处理

在学习OVS VXLAN实现之前&#xff0c;我们先回顾一下传统VTEP设备是如何处理VXLAN报文的。如下图所示&#xff1a; vxlan报文进入交换机端口后&#xff0c;根据报文头部信息进行vxlan隧道终结。隧道终结后&#xff0c;根据underlay信息进行overlay映射&#xff0c;得到overlay的…

鲲鹏devkit性能分析工具介绍(四)

鲲鹏devkit性能分析工具介绍&#xff08;四&#xff09; 前面我们已经介绍了鲲鹏devkit性能分析工具的全景分析、热点函数分析、进程/线程分析、微架构分析、和访存分析&#xff0c;由此可见进行性能调优绝对不能够仅仅去进行一方面的考察而是需要全方面的数据分析进行一定的舍…

8、多进程之间的通信

多进程之间的常用通信方法有两种&#xff0c;及Queue和Pipe 一、Queue Queue([maxsize])&#xff1a;创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数&#xff0c;则无大小限制。底层队列使用管道和锁定实现。另外&#xff0c;还需要运行支持线程以便队列中…

[附源码]计算机毕业设计springboot基于Web的软考题库平台

项目运行 环境配置&#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…

[论文阅读] Curriculum Semi-supervised Segmentation

[论文地址] [代码] [MICCAI 19] Abstract 本研究调查了半监督CNN分割的课程式策略&#xff0c;它设计了一个回归网络来学习图像级信息&#xff0c;如目标区域的大小。这些回归被用来有效地规范分割网络&#xff0c;约束未标记图像的softmax预测&#xff0c;使其与推断的标签分…

16-JavaSE基础巩固项目:拼图小游戏

阶段项目-拼图小游戏 一、项目介绍 1、目的 锻炼逻辑思维能力&#xff0c;让我们知道前面学习的知识点在实际开发中的应用场景。 1、为了学习一个新知识&#xff1a;GUI GUI全称&#xff1a;Graphical User Interface&#xff08;又称图形用户接口&#xff09;是指采用图形化…

【Android进阶之旅】内存泄漏的危害有哪些?(案例分析)

随着计算机应用需求的日益增加&#xff0c;应用程序的设计与开发也相应的日趋复杂&#xff1b; 开发人员在程序实现的过程中处理的变量也大量增加&#xff0c;如何有效进行内存分配和释放&#xff0c;防止内存泄漏的问题变得越来越突出 例如&#xff1a; 服务器应用软件&#x…

Redis 内存淘汰和过期删除策略

提起使用Redis的优点&#xff0c;大家可以列举出许多&#xff0c;比如&#xff1a;数据存储在内存&#xff0c;读写速度快&#xff0c;性能优异。比如数据持久化&#xff0c;便于数据备份及恢复等等。 分布式服务系统平台发展至今&#xff0c;Redis活跃在平台的各个领域&#…