当前位置: 首页 > news >正文

基于jdk11和基于apache-httpclient的http请求工具类

1.基于apache-httpclient

需要引入依赖
  <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.5</version></dependency>

工具类如下:

package com.bw.edgeagent.common.util;import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.bw.edgeagent.uitl.JSONUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
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.*;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
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.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.shaded.okhttp3.OkHttpClient;
import org.testcontainers.shaded.okhttp3.Request;
import org.testcontainers.shaded.okhttp3.RequestBody;
import org.testcontainers.shaded.okhttp3.Response;import javax.net.ssl.SSLContext;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.*;/*** @Author MXF* @Description Htpp请求工具类* @Date 2023/12/21 10:59*/
public class IotHttpClientUtil {private static Logger log = LoggerFactory.getLogger(IotHttpClientUtilbak.class);private final static String DEFAULT_ENCODE = "UTF-8";/*** 服务端返回的cookie,有更新则覆盖*/private static String COOKIE_VALUE = "";/*** 默认 10s 超时*/private static final int TIME_OUT = 10 * 1000;private IotHttpClientUtilbak() {}/*** 忽略 ssl** @return*/private static SSLContext buildIgnoreContext() {SSLContext sslContext = null;try {sslContext = SSLContexts.custom().setProtocol("TLSv1.2").build();} catch (NoSuchAlgorithmException | KeyManagementException e) {log.error(e.getMessage(), e);}return sslContext;}private static CloseableHttpClient getClient(int timeOut) {RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut).setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();SSLContext sslContext = buildIgnoreContext();// 注册Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", new SSLConnectionSocketFactory(sslContext)).build();PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);return HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(requestConfig).build();}/*** POST application/json请求** @param url     请求地址* @param jsonStr 请求数据json字符串* @param headers 请求头* @param timeOut 超时时间* @return*/public static String sendPostJson(String url, String jsonStr, Map<String, String> headers, int timeOut) {HttpPost post = new HttpPost(url);if (headers != null && headers.size() > 0) {for (Map.Entry<String, String> entry : headers.entrySet()) {post.setHeader(entry.getKey(), entry.getValue());}}StringEntity entity = new StringEntity(jsonStr, DEFAULT_ENCODE);entity.setContentEncoding(DEFAULT_ENCODE);entity.setContentType("application/json;charset=" + DEFAULT_ENCODE);post.setEntity(entity);return execute(post, timeOut);}public static String sendDelete(String url, Map<String, String> headers, int timeOut) {HttpDelete httpDelete = new HttpDelete(url);if (headers != null && headers.size() > 0) {for (Map.Entry<String, String> entry : headers.entrySet()) {httpDelete.setHeader(entry.getKey(), entry.getValue());}}return execute(httpDelete, timeOut);}public static String sendDelete(String url, Map<String, String> headers) {return sendDelete(url, headers, TIME_OUT);}/*** POST application/json请求** @param url     请求地址* @param jsonStr 请求数据json字符串* @param headers 请求头* @return*/public static String sendPostJson(String url, String jsonStr, Map<String, String> headers) {return sendPostJson(url, jsonStr, headers, TIME_OUT);}/*** POST application/json请求** @param url     请求地址* @param jsonStr 请求数据json字符串* @param timeOut 超时时间* @return*/public static String sendPostJson(String url, String jsonStr, int timeOut) {return sendPostJson(url, jsonStr, new HashMap<>(0), timeOut);}/*** POST application/json请求** @param url     请求地址* @param jsonStr 请求数据json字符串* @return*/public static String sendPostJson(String url, String jsonStr) {return sendPostJson(url, jsonStr, TIME_OUT);}/*** POST application/json请求** @param url  请求地址* @param data 请求数据* @return*/public static String sendPostJson(String url, Object data) {if (data == null) {data = new HashMap(0);}return sendPostJson(url, JSONUtil.toJsonStr(data));}/*** POST application/json请求** @param url          请求地址* @param jsonStr      请求数据json字符串* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*/public static <T> T postJsonForObject(String url, String jsonStr, Class<T> responseType) {String result = sendPostJson(url, jsonStr);if (StringUtils.isNotBlank(result)) {return JSONUtil.toBean(result, responseType);} else {return null;}}/*** POST application/json请求** @param url          请求地址* @param jsonStr      请求数据json字符串* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*//* public static <T> T postJsonForObject(String url, String jsonStr, TypeReference<T> responseType) {String result = sendPostJson(url, jsonStr);if (StringUtils.isNotBlank(result)) {return JSONUtil.toBean(result, responseType);} else {return null;}}*//*** POST application/json请求** @param url          请求地址* @param data         请求数据* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*/public static <T> T postJsonForObject(String url, Object data, Class<T> responseType) {if (data == null) {data = new HashMap(0);}return postJsonForObject(url, JSONUtil.toJsonStr(data), responseType);}/*** POST application/json请求** @param url          请求地址* @param data         请求数据* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*/public static <T> T postJsonForObject(String url, Object data, T responseType) {if (data == null) {data = new HashMap(0);}return postJsonForObject(url, JSONUtil.toJsonStr(data), responseType);}/*** POST application/x-www-form-urlencoded 请求** @param url    请求地址* @param params 请求数据map* @return*/public static String sendPostForm(String url, Map<String, Object> params) {// 手动添加CookiesMap<String, String> hearParams = new HashMap<>();if (ObjectUtil.isNotEmpty(COOKIE_VALUE)) {// 添加Cookie到请求头hearParams.put("Cookie", COOKIE_VALUE);}return sendPostForm(url, params, hearParams);}/*** POST application/x-www-form-urlencoded 请求** @param url     请求地址* @param params  请求数据map* @param timeOut 超时时间* @return*/public static String sendPostForm(String url, Map<String, Object> params, int timeOut) {Map<String, String> headers = new HashMap<>(1);return sendPostForm(url, params, headers, timeOut);}/*** POST application/x-www-form-urlencoded 请求** @param url     请求地址* @param params  请求数据map* @param headers 请求头* @return*/public static String sendPostForm(String url, Map<String, Object> params, Map<String, String> headers) {return sendPostForm(url, params, headers, TIME_OUT);}/*** POST application/x-www-form-urlencoded 请求** @param url     请求地址* @param params  请求数据map* @param headers 请求头* @param timeOut 超时时间* @return*/public static String sendPostForm(String url, Map<String, Object> params, Map<String, String> headers, int timeOut) {UrlEncodedFormEntity reqEntity = createFormEntity(params);HttpPost httppost = new HttpPost(url);httppost.addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");if (headers != null) {for (Map.Entry<String, String> entry : headers.entrySet()) {if (StrUtil.equalsAnyIgnoreCase(entry.getKey(), HttpHeaders.CONTENT_LENGTH, HttpHeaders.CONTENT_TYPE)) {continue;}httppost.addHeader(entry.getKey(), entry.getValue());}}httppost.setEntity(reqEntity);return execute(httppost, timeOut);}/*** POST application/x-www-form-urlencoded 请求** @param url          请求地址* @param params       请求数据map* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*/
/*        public static <T> T postFormForObject(String url, Map<String, String> params, Class<T> responseType) {String result = sendPostForm(url, params);if (StringUtils.isNotBlank(result)) {return JSONUtil.toBean(result, responseType);} else {return null;}}*//*** POST application/x-www-form-urlencoded 请求** @param url          请求地址* @param params       请求数据map* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*/public static <T> T postFormForObject(String url, Map<String, Object> params, Class<T> responseType) {String result = sendPostForm(url, params);if (StringUtils.isNotBlank(result)) {return JSONUtil.toBean(result, responseType);} else {return null;}}/*** GET 请求** @param url     请求地址* @param params  请求参数* @param timeOut 超时时间* @return*/public static String sendGet(String url, Map<String, Object> params, int timeOut) {return sendGet(url, params, new HashMap<>(1), timeOut);}/*** GET 请求** @param url    请求地址* @param params 请求参数* @return*/public static String sendGet(String url, Map<String, Object> params) {// 手动添加CookiesMap<String, String> hearParams = new HashMap<>();if (ObjectUtil.isNotEmpty(COOKIE_VALUE)) {// 添加Cookie到请求头hearParams.put("Cookie", COOKIE_VALUE);}return sendGet(url, params, hearParams);}/*** GET 请求** @param url     url* @param params  请求参数* @param headers 请求头* @param timeOut 超时时间* @return*/public static String sendGet(String url, Map<String, Object> params, Map<String, String> headers, int timeOut) {if (url == null) {return null;}try {URIBuilder uriBuilder = new URIBuilder(url);if (null != params) {uriBuilder.setParameters(getNameValuePairList(params));}URI uri = uriBuilder.build();String rawQueryString = uri.getRawQuery();//拼接urlif (StringUtils.isNotBlank(rawQueryString)) {// 防止原本url里面就有参数if (!url.contains("?")) {url = url + "?";}if (url.endsWith("?")) {url = url + rawQueryString;} else {url = url + "&" + rawQueryString;}}HttpGet httpGet = new HttpGet(url);if (headers != null) {Set<Map.Entry<String, String>> entrySet = headers.entrySet();for (Map.Entry<String, String> entry : entrySet) {httpGet.setHeader(entry.getKey(), entry.getValue());}}return execute(httpGet, timeOut);} catch (URISyntaxException e) {log.error(e.getMessage(), e);}return null;}/*** GET 请求** @param url     请求地址* @param params  请求参数* @param headers 请求头* @return*/public static String sendGet(String url, Map<String, Object> params, Map<String, String> headers) {return sendGet(url, params, headers, TIME_OUT);}/*** GET 请求** @param url          请求地址* @param params       请求参数* @param responseType 返回值类型* @return* @author lizhenjiang* @date 2020/05/30*/public static <T> T getForObject(String url, Map<String, Object> params, Class<T> responseType) {String result = sendGet(url, params);if (StringUtils.isNotBlank(result)) {return JSONUtil.toBean(result, responseType);} else {return null;}}private static List<NameValuePair> getNameValuePairList(Map<String, Object> params) {List<NameValuePair> list = new ArrayList<>();try {if (params != null && !params.isEmpty()) {for (String key : params.keySet()) {String value = params.get(key).toString();if (value != null) {list.add(new BasicNameValuePair(key, value));}}}} catch (Exception e) {log.error(e.getMessage(), e);}return list;}private static UrlEncodedFormEntity createFormEntity(Map<String, Object> pram) {try {List<NameValuePair> formParams = getNameValuePairList(pram);return new UrlEncodedFormEntity(formParams, DEFAULT_ENCODE);} catch (UnsupportedEncodingException e) {log.error(e.getMessage(), e);}return null;}private static String execute(HttpRequestBase requestBase, int timeOut) {StringBuilder sb = new StringBuilder();BufferedReader reader = null;CloseableHttpResponse response = null;CloseableHttpClient httpClient = getClient(timeOut);try {// 执行long start = System.currentTimeMillis();response = httpClient.execute(requestBase);//Header[] headers = response.getAllHeaders();//获取服务端返回的cookie并设置到全局变量,下一次发起请求使用,有更新则覆盖Header[] cookies = response.getHeaders("Set-Cookie");if (ObjectUtil.isNotEmpty(cookies)) {System.out.println(cookies);StringBuilder cookieValue = new StringBuilder();for (Header h : cookies) {cookieValue.append(h.getValue());}COOKIE_VALUE = cookieValue.toString();}log.info("请求id: {} , url: {} , 耗时: {} ", requestBase.getURI().toString(), (System.currentTimeMillis() - start));HttpEntity entity = response.getEntity();reader = new BufferedReader(new InputStreamReader(entity.getContent(), DEFAULT_ENCODE));String line = reader.readLine();while (line != null) {sb.append(line);line = reader.readLine();}EntityUtils.consume(entity);} catch (Exception e) {log.error("远程调用异常", e);} finally {try {if (reader != null) {reader.close();}if (response != null) {response.close();}httpClient.close();} catch (IOException e) {log.error("", e);}}return sb.toString();}/*** POST   multipart/form-data  请求** @param requestUrl* @param body* @return*/public static String sendPostWithFile(String requestUrl, RequestBody body) {try {OkHttpClient client = new OkHttpClient().newBuilder().build();Request request = new Request.Builder().url(requestUrl).method("POST", body).addHeader("Content-Type", "multipart/form-data").build();Response response = client.newCall(request).execute();if (response.body() == null) {log.info("短信发送httpClent获取数据为空");return null;}log.info("from-data:" + response.body().toString());return response.body().string();} catch (Exception e) {log.info("******短信发送httpClent  请求出错****" + e.getMessage());} finally {}return null;}
}

2.基于jdk11

工具类代码如下:

package com.bw.edgeagent.common.util;import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.List;
import java.util.Map;/*** @Author MXF* @Description Htpp请求工具类* @Date 2023/12/21 10:59*/
public class IotHttpUtil {private final static String DEFAULT_ENCODE = "UTF-8";/*** 服务端返回的cookie,有更新则覆盖*/private static String COOKIE_VALUE = "";/*** 默认 10s 超时*/private static final int TIME_OUT = 10 * 1000;private IotHttpUtil() {}/*** 发送GET请求** @param url* @return*/public static String get(String url) {return get(url, null);}/*** 发送GET请求** @param url* @param params* @return*/public static String get(String url, Map<String, String> params) {HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(URI.create(buildUrlWithParams(url, params)));if (ObjectUtil.isNotEmpty(COOKIE_VALUE)) {//手动添加Cookies,添加Cookie到请求头requestBuilder.header("Cookie", COOKIE_VALUE);}HttpRequest request = requestBuilder.header("Content-Type", "application/x-www-form-urlencoded").GET().build();return send(request);}/*** 给访问路径拼接参数** @param url* @param params* @return*/private static String buildUrlWithParams(String url, Map<String, String> params) {if (params == null || params.isEmpty()) {return url;}StringBuilder sb = new StringBuilder(url);// 若已有参数则和之前的参数合并sb.append(url.indexOf('?') == -1 ? '?' : '&');// 循环拼接参数params.forEach((key, value) -> {if (StrUtil.isNotBlank(value)) {try {value = URLEncoder.encode(value, Charset.defaultCharset());} catch (Exception e) {throw new RuntimeException(e);}sb.append(key).append('=').append(value).append('&');}});// 去掉最后的&return sb.substring(0, sb.length() - 1);}/*** 发送POST请求** @param url* @param data* @return*/public static String post(String url, String data) {return post(url, data, null);}/*** 发送POST请求** @param url* @param data* @param params* @return*/public static String post(String url, String data, Map<String, String> params) {HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(URI.create(buildUrlWithParams(url, params)));if (ObjectUtil.isNotEmpty(COOKIE_VALUE)) {//手动添加Cookies,添加Cookie到请求头requestBuilder.header("Cookie", COOKIE_VALUE);}HttpRequest request = requestBuilder.header("Content-Type", "application/x-www-form-urlencoded").POST(HttpRequest.BodyPublishers.ofString(data, Charset.forName(Charset.defaultCharset().toString()))).build();return send(request);}/*** 发送带本地证书的POST请求** @param url* @param data* @param certFile* @param certPwd* @return*/public static String postWithCertificate(String url, String data, File certFile, char[] certPwd) {HttpRequest request = HttpRequest.newBuilder(URI.create(url)).header("Content-Type", "application/x-www-form-urlencoded").POST(HttpRequest.BodyPublishers.ofString(data, Charset.forName(Charset.defaultCharset().toString()))).build();try {// 实例化SSL上下文SSLContext sslContext = SSLContext.getInstance("TLS");// 实例化密钥管理工厂KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());// 实例化密钥库KeyStore keyStore = KeyStore.getInstance("PKCS12");// 加载证书文件和密码keyStore.load(new FileInputStream(certFile), certPwd);// 初始化密钥管理工厂keyManagerFactory.init(keyStore, certPwd);// 初始化SSL上下文sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());// 构建HTTP客户端实例HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).get();} catch (Exception e) {throw new RuntimeException(e);}}/*** 发送http请求** @param request* @return*/private static String send(HttpRequest request) {HttpClient client = HttpClient.newHttpClient();try {HttpResponse<String> res = client.send(request, HttpResponse.BodyHandlers.ofString());HttpHeaders headers = res.headers();List<String> cookies = headers.allValues("set-cookie");//获取服务端返回的cookie并设置到全局变量,下一次发起请求使用,有更新则覆盖if (ObjectUtil.isNotEmpty(cookies)) {System.out.println(cookies);StringBuilder cookieValue = new StringBuilder();for (String c : cookies) {cookieValue.append(c);}COOKIE_VALUE = cookieValue.toString();}return res.body();} catch (InterruptedException | IOException e) {throw new RuntimeException(e);}}//    public static void main(String[] args) {
//        Map<String, String> loginParamMap = new HashMap<>();
//        loginParamMap.put("username", "admin");
//        //密码admin 密码MD5加密32位
//        String password = DigestUtil.md5Hex("admin");
//        loginParamMap.put("password", password);
//        //String res = HttpUtil.sendGet(WVP_URL + WvpVideoUrlEnums.登录.getUrl(), HttpUtil.asUrlParams(loginParamMap));
//        String res = get("http://10.1.7.33:38080" + WvpVideoUrlEnums.登录.getUrl(), loginParamMap);
//        System.out.println("登录结果----->" + res);
//    }}

说明:写这两个工具类的起因是客户端发起请求登录服务端成功后,后续请求需要携带服务端返回的响应头cookie会话信息来鉴权,否则后续请求会报401

相关文章:

基于jdk11和基于apache-httpclient的http请求工具类

1.基于apache-httpclient 需要引入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.5</version></dependency> 工具类如下&#xff1a; package com.bw.e…...

Node.js(二)-模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…...

ARM AArch64的TrustZone架构详解(上)

目录 一、概述 1.1 在开始之前 二、什么是TrustZone? 2.1 Armv8-M的TrustZone 2.2 Armv9-A Realm Management Extension(RME)...

从源PC上一次性p2v(qcow2)的构想

磁盘分区表&#xff0c;虚拟硬盘文件&#xff0c;操作系统引导 1. 基本概念和术语 源硬盘&#xff1a;一般就是客户的PC机的硬盘&#xff0c;硬盘里面包含了Windows分区。 源Windows&#xff1a;以源硬盘启动的Windows环境。 虚拟磁盘文件&#xff1a;文件格式有qcow2、vhd…...

数据结构:KMP算法

1.何为KMP算法 KMP算法是由Knuth、Morris和Pratt三位学者发明的&#xff0c;所以取了三位学者名字的首字母&#xff0c;叫作KMP算法。 2.KMP的用处 KMP主要用于字符串匹配的问题&#xff0c;主要思想是当出现字符串不匹配时&#xff0c;我们可以知道一部分之前已经匹配过的的文…...

小程序真机如何清除订阅数据

在做小程序订阅消息开发的过程中发现&#xff0c;真机上如果是选择了‘总是保持以上选择’&#xff0c;一旦用户授权后&#xff0c;后面就不会再弹出申请改订阅消息的授权弹窗&#xff0c;这对于开发过程中是很不方便的。 曾试过清除缓存&#xff0c;重进小程序也不能清除掉 解…...

基于ssm出租车管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…...

音视频转码

音视频转码是指&#xff1a; 容器中音视频数据编码方式转换&#xff0c;如由H.264编码转成mpeg-4编码&#xff0c;mp3转成AAC&#xff1b;音视频码率的转换&#xff0c;如4Mb视频码率降为2Mb&#xff0c;视频分辨率的转换&#xff0c;如1080P转换为720P&#xff0c;音频重采样…...

编解码异常分析

前言 最近在做的项目&#xff0c;有H264解码的需求。部分H264文件解码播放后&#xff0c;显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…...

APISpace 热门好用的API推荐,含免费次数

短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可达&#xff0c;99.99&#xff05;到达率&#xff0c;支持大容量高并发。通知短信&#xff1a;短信通知支持三大运营商以及虚拟运营商&#xff0c;我们提供电信级运维…...

Qt/QML编程学习之心得:一个.qml文件调用另一个.qml文件(十七)

在c++中,一个文件调用另外一个文件最直接最快捷的方式就是#incldue<头文件>的使用,那么在元数据描述性语言QML中,如何从一个界面描述调用另外一个界面描述,一个.qml文件调用另外一个.qml呢?QML虽然有个import,但是用法可以说完全不同于#include。 引用方法1:直接…...

C++_单列模式介绍

介绍 (1)…什么是单例 1.只能有一个实例化的对象的类(2).单例有什么用 1.多线程的线程池的设计 2.系统中只需要一个窗口时才使用单例(无法重复创建) 3.一个操作系统只能有一个文件系统(3).单例怎么用 1.隐藏所有构造函数 2.静态成员内部调用构造函数实例化 3.提供一个静态函数来…...

油烟净化器如何做到高效净化?科技力量,清新餐饮生活

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 油烟净化器的出现&#xff0c;为我们的餐饮生活注入了一抹清新的色彩。然而&#xff0c;它究竟是如何工作的&#xff1f;为何能…...

【HTML5】HTML5 语音合成

一、前言 前一段时间在项目中需要用到播报文字语音。找到了 HTML 5 有这样的功能。 现在有时间进行总结下。 二、SpeechSynthesis SpeechSynthesis 接口是语音服务的控制接口。它可以用于获取设备上关于可用的合成声音的信息&#xff0c; 开始、暂停语音&#xff0c;或者别…...

顺序表的实现

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为&#xff1a; 3.2 接口实现&#xff1a; 四、基本操作实现 4.1顺序表初始化 4.2检查空间&#xff0c;如果满了&#xff0c;进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…...

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…...

Java面试整理-Java设计模式

Java中的设计模式通常是从更广泛的面向对象设计模式中借鉴而来的,这些模式旨在解决特定的设计问题和改善代码的可维护性、灵活性和可扩展性。设计模式大致可以分为三类:创建型、结构型和行为型。以下是这三类中一些常见的设计模式: 创建型模式 单例模式(Singleton):确保一…...

用CHAT了解更多知识点

问CHAT&#xff1a;什么是硅基生命和碳基生命&#xff1f; CHAT回复&#xff1a;硅基生命和碳基生命是两种理论性的生物体类型&#xff0c;这些生物体主要是由硅或碳元素以及其他元素构成的。 碳基生命是我们当前所熟知的生命形式。碳元素能够形成稳定且复杂的分子&#xff0c;…...

一个利用摸鱼时间背单词的软件

大家好&#xff0c;我是 Java陈序员。 最近进入了考试季&#xff0c;各种考试&#xff0c;英语四六级、考研、期末考等。不知道大家的英语四六级成绩怎么样呢&#xff1f; 记得大学时&#xff0c;英语四级都是靠高中学习积累的老本才勉强过关。 而六级则是考了多次&#xff…...

Matlab/Simulink的一些功能用法笔记(3)

01--引言 最近加入到一个项目组&#xff0c;有一些测试需要去支持&#xff0c;通过了解原先团队的测试方法后&#xff0c;自己作了如下改善&#xff0c;大大提高了工作效率。这也许就是软件开发的意义吧&#xff0c;能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …...

Wafer晶圆封装工艺介绍

芯片封装的目的&#xff08;The purpose of chip packaging&#xff09;: 芯片上的IC管芯被切割以进行管芯间连接&#xff0c;通过引线键合连接外部引脚&#xff0c;然后进行成型&#xff0c;以保护电子封装器件免受环境污染&#xff08;水分、温度、污染物等&#xff09;&…...

Mac OS 13+,Apple Silicon,删除OBS虚拟摄像头(virtual camera),

原文链接: https://www.reddit.com/r/MacOS/comments/142cv OBS为了捕获摄像头视频,将虚拟摄像头插件内置为系统插件了.如下 直接删除没有权限的,要删除他,在mac os 13以后,需要关闭先关闭苹果系统的完整性保护(SIP) Apple 芯片(M1,....)的恢复模式分为两种,回退恢复模式,和…...

精解 ES6 Promise 用法

&#x1f431; 个人主页&#xff1a;SHOW科技&#xff0c;公众号&#xff1a;SHOW科技 &#x1f64b;‍♂️ 作者简介&#xff1a;2020参加工作&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;优质专栏&#x…...

Linux之基础I/O

目录 一、C语言中的文件操作 二、系统文件操作I/O 三、文件描述符fd 1、文件描述符的引入 2、对fd的理解 3、文件描述符的分配规则 四、重定向 1、重定向的原理 2、重定向的系统调用dup2 五、Linux下一切皆文件 一、C语言中的文件操作 1、打开和关闭 在C语言的文…...

Linux开发工具——gcc篇

gcc的使用 文章目录 gcc的使用 历史遗留问题&#xff08;普通用户sudo&#xff09; gcc编译过程 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&a…...

C#通讯——关于Winform中的简单的Http服务器与客户端

C#通讯——关于Winform中的简单的Http服务器与客户端 前言一、Http是什么&#xff1f;二、简单的Http服务器三、简单的Http客户端四、实际调用五、Winform中Http服务器和WebApi的区别&#xff1f; 前言 在实际项目中通讯的交互的过程中&#xff0c;遇见数据传输时同事和我说用…...

Mendelson AS2 介绍下载和配置

最近与一家国外公司做EDI对接&#xff0c;并且EDI通讯工具是基于AS2协议的。目前开源的as2的开源项目有openas2,Mendelson AS2&#xff0c;和国人写的freeas2但是&#xff0c;现在freeas2已经被从开源中国不能下载了&#xff0c;变为收费的版本了。 如果你需要使用基于AS2协议…...

旅游海报图怎么做二维码展示?扫码即可查看图片

现在旅游攻略的海报可以做成二维码印刷在宣传单单页或者分享给用户来了解目的地的实际情况&#xff0c;出行路线、宣传海报等。用户只需要扫描二维码就可以查看内容&#xff0c;更加的方便省劲&#xff0c;那么旅游海报的图片二维码制作的技巧有哪些呢&#xff1f;使用图片二维…...

常用git指令

初始化Git仓库:git init 添加文件到暂存区:git add <file> 提交更改到本地仓库:git commit -m "commit message" 查看本地仓库的提交历史:git log 创建分支:git branch <branch_name> 切换分支:git checkout <branch_name> 查看所有分支:git…...

【FPGA】分享一些FPGA协同MATLAB开发的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…...