Java使用HttpClient5实现发送HTTP请求

news2024/10/23 0:38:24

Java 实现发送 HTTP 请求,系列文章:

《Java使用原生HttpURLConnection实现发送HTTP请求》

《Java使用HttpClient5实现发送HTTP请求》

《SpringBoot使用RestTemplate实现发送HTTP请求》

1、HttpClient5 的介绍

HttpClient5 是 Apache HttpComponents 项目中的一个重要组件,它是一个功能齐全且高度可定制的 HTTP 客户端库,专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。

以下是对 HttpClient5 的详细介绍:

  • 多协议支持:HttpClient5 支持 HTTP/1.1 和 HTTP/2 协议,特别是 HTTP/2 的多路复用和流优先级等特性,提升了网络请求效率。
  • 连接池管理:内置的连接池机制能提高并发处理性能,减少资源消耗。
  • 多种认证机制:支持 Basic、Digest、NTLM、Kerberos 等多种认证方式,能够处理多种安全场景。
  • Cookie管理:内置 Cookie 管理功能,能够自动处理服务端返回的 Cookie 并在后续请求中使用,模拟浏览器行为。
  • SSL/TLS支持:支持 HTTPS,提供自定义 SSL/TLS 配置,确保通信的安全性。
  • 易于扩展和定制:HttpClient5 的设计高度模块化,用户可以根据需要对连接管理、重定向策略、请求重试策略、代理设置等进行灵活定制。
  • 代理支持:可以轻松配置 HTTP 或 SOCKS 代理,用于跨网络访问和隐私保护。

2、创建 HttpClient5 工具类

通过将常用的方法封装到工具类中,可以避免重复编写相同的代码,从而提高代码的复用性‌。

(1)添加 Maven 依赖

在项目的 pom.xml 配置文件中添加 HttpClient5 依赖。

<!-- HttpClient5 依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.4</version>
</dependency>

(2)创建工具类

 创建 HttpClientUtil 类(基于 HttpClient5 的 HTTP 请求工具类)。

package com.pjb.consumer.util;

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.entity.UrlEncodedFormEntity;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpStatus;
import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.apache.hc.core5.http.message.BasicNameValuePair;
import org.apache.hc.core5.util.Timeout;

import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 基于 HttpClient5 的 HTTP 请求工具类
 * @author pan_junbiao
 **/
public class HttpClientUtil
{
    // 超时时间
    private final static int timeOut = 60000; //60秒

    /**
     * 发送 GET 请求并获取响应数据
     *
     * @param url    请求地址
     * @param params 请求参数
     * @return 响应数据字符串
     */
    public static String doGet(String url, Map<String, String> params)
    {
        HttpGet httpGet = null;                    //请求对象
        CloseableHttpClient httpClient = null;     //请求客户端
        CloseableHttpResponse httpResponse = null; //响应对象
        try
        {
            // 1、拼接 URL
            StringBuffer stringBuffer = new StringBuffer(url);
            if (params != null && !params.isEmpty())
            {
                stringBuffer.append("?");
                for (Map.Entry<String, String> entry : params.entrySet())
                {
                    stringBuffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
                stringBuffer.deleteCharAt(stringBuffer.length() - 1);
            }
            URI targetUri = new URI(stringBuffer.toString());

            // 2、创建请求对象
            httpGet = new HttpGet(targetUri);
            // 请求配置实例(不需要可忽略)
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectionRequestTimeout(Timeout.ofMilliseconds(timeOut)) // 设置连接请求超时时间
                    .setResponseTimeout(Timeout.ofMilliseconds(timeOut)) // 设置响应超时时间
                    .build();
            httpGet.setConfig(requestConfig);

            // 3、创建请求客户端
            httpClient = HttpClients.createDefault();

            // 4、执行请求操作,并返回响应结果
            httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            String result = EntityUtils.toString(httpEntity);
            if (httpResponse.getCode() != HttpStatus.SC_OK)
            {
                //记录错误日志
                String errorMessage = String.format("[执行异常]执行GET请求操作失败,状态码:%s,错误信息:%s", httpResponse.getCode(), result);
                System.out.println(errorMessage);
                throw new Exception(errorMessage);
            }
            return result;
        } catch (Exception ex)
        {
            ex.printStackTrace();
        } finally
        {
            //释放资源
            releaseResource(httpGet, httpClient, httpResponse);
        }
        return null;
    }

    /**
     * 发送 POST 请求并获取响应数据
     *
     * @param url    请求地址
     * @param params 请求参数
     * @return 响应数据字符串
     */
    public static String doPost(String url, Map<String, String> params)
    {
        HttpPost httpPost = null;                  //请求对象
        CloseableHttpClient httpClient = null;     //请求客户端
        CloseableHttpResponse httpResponse = null; //响应对象
        try
        {
            // 1、创建 URL 对象
            URI targetUri = new URI(url);

            // 2、创建请求对象
            httpPost = new HttpPost(targetUri);
            // 请求配置实例(不需要可忽略)
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectionRequestTimeout(Timeout.ofMilliseconds(timeOut)) // 设置连接请求超时时间
                    .setResponseTimeout(Timeout.ofMilliseconds(timeOut)) // 设置响应超时
                    .build();
            httpPost.setConfig(requestConfig);

            // 设置请求头
            httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
            // 设置请求格式 multipart/form-data
            httpPost.addHeader("Content-type", "multipart/form-data;boundary=" + UUID.randomUUID().toString());
            httpPost.addHeader("Accept", "*/*");
            // UTF-8 解决中文乱码
            httpPost.addHeader("Accept-Encoding", "UTF-8");
            httpPost.addHeader("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36");

            // 3、创建请求客户端
            httpClient = HttpClients.createDefault();

            // 4、写入请求体
            List<NameValuePair> paramList = new ArrayList<>();
            if (params != null && !params.isEmpty())
            {
                for (Map.Entry<String, String> entry : params.entrySet())
                {
                    BasicNameValuePair nameValuePair = new BasicNameValuePair(entry.getKey(), entry.getValue());
                    paramList.add(nameValuePair);
                }
            }
            UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(paramList, StandardCharsets.UTF_8);
            httpPost.setEntity(urlEncodedFormEntity);

            // 5、执行请求操作,并返回响应结果
            httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            String result = EntityUtils.toString(httpEntity);
            if (httpResponse.getCode() != HttpStatus.SC_OK)
            {
                //记录错误日志
                String errorMessage = String.format("[执行异常]执行POST请求操作失败,状态码:%s,错误信息:%s", httpResponse.getCode(), result);
                System.out.println(errorMessage);
                throw new Exception(errorMessage);
            }
            return result;
        } catch (Exception ex)
        {
            ex.printStackTrace();
        } finally
        {
            //释放资源
            releaseResource(httpPost, httpClient, httpResponse);
        }
        return null;
    }

    /**
     * 发送 JSON 格式的 POST 请求并获取响应数据
     *
     * @param url       请求地址
     * @param jsonParam JSON格式的请求参数
     * @return 响应数据字符串
     */
    public static String doJsonPost(String url, String jsonParam)
    {
        HttpPost httpPost = null;                  //请求对象
        CloseableHttpClient httpClient = null;     //请求客户端
        CloseableHttpResponse httpResponse = null; //响应对象
        try
        {
            // 1、创建 URL 对象
            URI targetUri = new URI(url);

            // 2、创建请求对象
            httpPost = new HttpPost(targetUri);
            // 请求配置实例(不需要可忽略)
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectionRequestTimeout(Timeout.ofMilliseconds(timeOut)) // 设置连接请求超时时间
                    .setResponseTimeout(Timeout.ofMilliseconds(timeOut)) // 设置响应超时
                    .build();
            httpPost.setConfig(requestConfig);

            // 设置请求头
            httpPost.addHeader("Content-Type", "application/json");
            httpPost.addHeader("Accept-Encoding", "UTF-8");

            // 3、创建请求客户端
            httpClient = HttpClients.createDefault();

            // 3、写入请求体
            StringEntity entity = new StringEntity(jsonParam, StandardCharsets.UTF_8);
            httpPost.setEntity(entity);

            // 4、执行请求操作,并返回响应结果
            httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            String result = EntityUtils.toString(httpEntity);
            if (httpResponse.getCode() != HttpStatus.SC_OK)
            {
                //记录错误日志
                String errorMessage = String.format("[执行异常]执行POST请求操作失败,状态码:%s,错误信息:%s", httpResponse.getCode(), result);
                System.out.println(errorMessage);
                throw new Exception(errorMessage);
            }
            return result;
        } catch (Exception ex)
        {
            ex.printStackTrace();
        } finally
        {
            //释放资源
            releaseResource(httpPost, httpClient, httpResponse);
        }
        return null;
    }

    /**
     * 释放资源
     */
    private static void releaseResource(HttpUriRequestBase httpRequest, CloseableHttpClient httpClient, CloseableHttpResponse httpResponse)
    {
        if (httpRequest != null)
        {
            try
            {
                httpRequest.reset();
            } catch (Exception e)
            {
                System.out.println("关闭请求对象失败");
            }
        }

        if (httpClient != null)
        {
            try
            {
                httpClient.close();
            } catch (IOException e)
            {
                System.out.println("关闭请求客户端失败");
            }
        }

        if (httpResponse != null)
        {
            try
            {
                httpResponse.close();
            } catch (IOException e)
            {
                System.out.println("关闭响应对象失败");
            }
        }
    }
}

3、综合实例

【实例】实现用户信息的查询、新增、修改、删除接口,并使用 HttpClient5 实现接口的请求。

(1)在 controller 层,创建用户信息控制器类,实现查询、新增、修改、删除接口。

package com.pjb.business.controller;

import com.pjb.business.entity.UserInfo;
import com.pjb.business.exception.ApiResponseException;
import com.pjb.business.model.ApiModel.ApiResponseCode;
import com.pjb.business.model.ApiModel.ApiResponseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户信息控制器类
 * @author pan_junbiao
 **/
@RestController
@RequestMapping("/user")
@Api(description = "用户信息控制器")
public class UserController
{
    /**
     * 查询用户信息
     */
    @ApiOperation(value = "查询用户信息")
    @RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
    public ApiResponseResult<UserInfo> getUserInfo(Long userId)
    {
        if (userId <= 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        UserInfo userInfo = new UserInfo();
        userInfo.setUserId(userId);
        userInfo.setUserName("pan_junbiao的博客");
        userInfo.setBlogName("您好,欢迎访问 pan_junbiao的博客");
        userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, userInfo);
    }

    /**
     * 新增用户信息
     */
    @ApiOperation(value = "新增用户信息")
    @RequestMapping(value = "/addUserInfo", method = RequestMethod.POST)
    public ApiResponseResult<Boolean> addUserInfo(@RequestBody UserInfo userInfo)
    {
        if (userInfo == null || userInfo.getUserName() == null || userInfo.getUserName().length() == 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, true);
    }

    /**
     * 修改用户信息
     */
    @ApiOperation(value = "修改用户信息")
    @RequestMapping(value = "/updateUserInfo", method = RequestMethod.POST)
    public ApiResponseResult<Boolean> updateUserInfo(@RequestBody UserInfo userInfo)
    {
        if (userInfo == null && userInfo.getUserId() <= 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, true);
    }

    /**
     * 删除用户信息
     */
    @ApiOperation(value = "删除用户信息")
    @RequestMapping(value = "/deleteUserInfo", method = RequestMethod.POST)
    public ApiResponseResult<Boolean> deleteUserInfo(Long userId)
    {
        if (userId <= 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, true);
    }
}

(2)使用 HttpClient5 发送 Get 请求,查询用户信息。

/**
 * 使用 HttpClient5 发送 Get 请求,查询用户信息
 */
@Test
public void getUserInfo()
{
    //请求地址
    String url = "http://localhost:8085/user/getUserInfo";

    //请求参数
    Map<String, String> params = new HashMap<>();
    params.put("userId", "1");

    //发送 HTTP 的 Get 请求(核心代码)
    String httpResult = HttpClientUtil.doGet(url, params);

    //反序列化JSON结果
    ApiResponseResult<UserInfo> responseResult = JacksonUtil.getJsonToGenericityBean(httpResult, ApiResponseResult.class, UserInfo.class);
    UserInfo userInfo = responseResult.getData();
    System.out.println("响应JSON结果:" + httpResult);
    System.out.println("响应结果编码:" + responseResult.getCode());
    System.out.println("响应结果信息:" + responseResult.getMessage());
    System.out.println("用户编号:" + userInfo.getUserId());
    System.out.println("用户名称:" + userInfo.getUserName());
    System.out.println("博客信息:" + userInfo.getBlogName());
    System.out.println("博客地址:" + userInfo.getBlogUrl());
}

执行结果:

(3)使用 HttpClient5 发送 JSON 格式的 POST 请求,新增用户信息。

/**
 * 使用 HttpClient5 发送 JSON 格式的 POST 请求,新增用户信息
 */
@Test
public void addUserInfo()
{
    //请求地址
    String url = "http://localhost:8085/user/addUserInfo";

    //请求参数
    UserInfo userInfo = new UserInfo();
    userInfo.setUserId(2L);
    userInfo.setUserName("pan_junbiao的博客");
    userInfo.setBlogName("您好,欢迎访问 pan_junbiao的博客");
    userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");
    String json = JacksonUtil.getBeanToJson(userInfo);

    //发送 JSON 格式的 POST 请求(核心代码)
    String httpResult = HttpClientUtil.doJsonPost(url, json);
    System.out.println("响应结果:" + httpResult);
}

执行结果:

响应结果:{"code":200000,"message":"操作成功","data":true}

(4)使用 HttpClient5 发送 POST 请求,删除用户信息。

/**
 * 使用 HttpClient5 发送 POST 请求,删除用户信息
 */
@Test
public void deleteUserInfo()
{
    //请求地址
    String url = "http://localhost:8085/user/deleteUserInfo";

    //请求参数
    Map<String, String> params = new HashMap<>();
    params.put("userId","3");

    //发送 HTTP 的 POST 请求(核心代码)
    String httpResult = HttpClientUtil.doPost(url, params);
    System.out.println("响应结果:" + httpResult);
}

执行结果:

响应结果:{"code":200000,"message":"操作成功","data":true}

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

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

相关文章

文件处理新纪元:微信小程序的‘快递员’与‘整理师’

嗨&#xff0c;我是中二青年阿佑&#xff0c;今天阿佑将带领大家如何通过巧妙的文件处理功能&#xff0c;让用户体验从‘杂乱无章’到‘井井有条’的转变&#xff01; 文章目录 微信小程序的文件处理文件上传&#xff1a;小程序的“快递服务”文件下载&#xff1a;小程序的“超…

植物大战僵尸杂交版游戏分享

植物大战僵尸杂交版游戏下载&#xff1a;夸克网盘分享 无捆绑之类的隐形消费&#xff0c;下载即玩

vue3 解决背景图与窗口留有间隙的问题

需要实现一个登录界面&#xff0c;login.vue的代码如下&#xff1a; <script> import { ref } from vue;export default {setup() {return {};}, }; </script><template><div id"login-container" class"login-container"><di…

Taro构建的H5页面路由切换返回上一页存在白屏页面过渡

目录 项目背景&#xff1a;Taro与Hybrid开发问题描述&#xff1a;白屏现象可能的原因包括&#xff1a; 解决方案解决后的效果图 其他优化方案可参考&#xff1a; 项目背景&#xff1a;Taro与Hybrid开发 项目使用Taro框架同时开发微信小程序和H5页面&#xff0c;其中H5页面被嵌…

Nodes 节点

Goto Tree List 树列表 Nodes 节点 Tree List 节点是组织成树状层次结构的数据行。 Add New Nodes 添加新节点 如果 Tree List 具有数据源&#xff0c;则会自动生成节点&#xff08;TreeListNode 类对象&#xff09;。要在未绑定模式下添加节点&#xff0c;请调用“树列表设…

【K8S系列】Kubernetes Pod节点Pending状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 Pending 表示 Pod 已被创建&#xff0c;但尚未被调度到节点上&#xff0c;或者已调度到节点上但容器尚未开始运行。这一状态常常是因为某些条件未满足&#xff0c;导致 Pod 无法正常启动。以下是对 Pending 状态的详细分析及解决方案…

自由学习记录(12)

综合实践 2D的Shape&#xff0c;Tilemap都要导包的&#xff0c;编辑器也要导包&#xff0c;。。和2d沾边的可能3d都要主动导包 应该综合的去运用&#xff0c;不见得Tilemap就很万能&#xff0c;如果要做什么顶方块的有交互反应的物体&#xff0c; 那直接拖Sprite会更方便一些…

APIJSON 为零代码提供了新的思路

APIJSON 核心概念 APIJSON 是一种用于构建 RESTful API 的 JSON 格式&#xff0c;它提供了一种标准化的方式来定义和处理 API 请求和响应。APIJSON 的设计目标是简化前端和后端之间的数据交互&#xff0c;减少开发工作量&#xff0c;提高开发效率。 在线解析 自动生成文档&am…

【SpringBoot】16 文件上传(Thymeleaf + MySQL)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 文件上传是指将本地的图片、视频、音频等文件上传到服务器&#xff0c;供其他用户浏览下载的过程&#xff0c;文件上传在日常项目中用的非常广泛。 实现代码 第一步&#xff1a;在配置文件新增如下配置 application.yml s…

docker-compose-lnmp-wordpress

使用 docker-compose 在 CentOS 7 上编写并部署 LNMP (Linux, Nginx, MySQL, PHP) 环境的 YAML 文章目录 部署步骤&#xff1a;1. 安装 Docker 和 Docker Compose1.1安装 Docker&#xff1a;1.2安装 Docker Compose&#xff1a; 2.创建目录结构3.编写docker-compose.yml4.ngin…

Java项目-基于springboot框架的财务管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

科研进展 | RSE:全波形高光谱激光雷达数据Rclonte系列处理算法一

《环境遥感》&#xff08;Remote Sensing of Environment&#xff0c;IF11.1&#xff09;近日发表一项来自中国科学院空天信息创新研究院王力、牛铮研究员团队的全波形高光谱激光雷达&#xff08;hyperspectral LiDAR&#xff0c;HSL&#xff09;数据处理算法研究&#xff0c;论…

计算机组成原理一句话

文章目录 计算机系统概述存储系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&#xff…

DC系列靶机-DC6

一&#xff0c;环境的搭建 VM17 官网下载 kali 2023.4版 https://mirrors.tuna.tsinghua.edu.cn/kali-images/kali-2023.4/ 靶场文件 https://download.vulnhub.com/dc/DC-6.zip 二&#xff0c;攻略 首先进行主机发现&#xff1b; 接下来进行端口扫描&#xff1b; 开放了2…

初识git · 远程操作

目录 前言&#xff1a; 理解分布式版本控制系统 远程仓库 仓库操作 克隆仓库 推送和抓取 特殊文件 取别名 标签管理 前言&#xff1a; 在基本操作&#xff0c;分支管理这几个部分&#xff0c;我们都会在本地仓库操作了&#xff0c;但是目前还没有办法将自己的代码远程…

uniapp 实现input聚焦时选中内容(已封装)兼容微信小程序

老规矩先来看看效果噻&#xff01; 从上面的录屏中我们可以看出&#xff0c;要实现input自由选中内容的功能是可以实现的&#xff0c;原理其实很简单。 直接运行即可 <template><view><!-- <input class"psd"type"digit" :value"in…

第二代 GPT-SoVITS V2:解锁语音克隆与合成的无限可能

在 AI 技术蓬勃发展的今天&#xff0c;第二代 GPT-SoVITS V2 如一颗璀璨的明星闪耀登场&#xff0c;为语音处理领域带来了前所未有的变革。它是一款集先进技术与强大功能于一身的声音克隆与语音合成工具&#xff0c;由 RVC 变声器创始人 “花儿不哭” 与 AI 音色转换技术 Sovit…

当小程序学会‘读心术’:表单处理的神秘法则

哈喽&#xff0c;我是阿佑&#xff0c;今天将给大家给咱们的小程序赋能——“读心术”&#xff01; 文章目录 微信小程序的表单处理表单元素&#xff1a;小程序的“语言”表单事件&#xff1a;小程序的“听觉”表单提交&#xff1a;小程序的“表达”总结 微信小程序的表单处理 …

Oracle数据库系统表空间过大,清理SYSTEM、SYSAUX表空间

一.前言 在oracle数据库中&#xff0c;system为系统表空间&#xff0c;存放着一些我们经常用到的系统表和视图&#xff0c;sysaux为辅助表空间&#xff0c;辅助着系统表空间。这两个表空间不宜添加数据文件&#xff0c;会使系统表空间过于臃肿&#xff0c;从而影响数据库的使用…

【Jenkins】2024 最新版本的 Jenkins 权限修改为 root 用户启动,解决 permission-denied 报错问题

最新版本的 Jenkins 修改 /etc/sysconfig/jenkins 中的 JENKINS_USERroot不会再生效&#xff0c;需要按照以下配置进行操作&#xff1a; vim /usr/lib/systemd/system/jenkins.service然后重启就可以了 systemctl daemon-reload # 重新加载 systemd 的配置文件 systemctl res…