基于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> 工具类如下: package com.bw.e…...

Node.js(二)-模块化
1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化,就是遵守固定的规则&…...
ARM AArch64的TrustZone架构详解(上)
目录 一、概述 1.1 在开始之前 二、什么是TrustZone? 2.1 Armv8-M的TrustZone 2.2 Armv9-A Realm Management Extension(RME)...
从源PC上一次性p2v(qcow2)的构想
磁盘分区表,虚拟硬盘文件,操作系统引导 1. 基本概念和术语 源硬盘:一般就是客户的PC机的硬盘,硬盘里面包含了Windows分区。 源Windows:以源硬盘启动的Windows环境。 虚拟磁盘文件:文件格式有qcow2、vhd…...

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

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

基于ssm出租车管理系统的设计与实现论文
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&…...
音视频转码
音视频转码是指: 容器中音视频数据编码方式转换,如由H.264编码转成mpeg-4编码,mp3转成AAC;音视频码率的转换,如4Mb视频码率降为2Mb,视频分辨率的转换,如1080P转换为720P,音频重采样…...

编解码异常分析
前言 最近在做的项目,有H264解码的需求。部分H264文件解码播放后,显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…...
APISpace 热门好用的API推荐,含免费次数
短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。通知短信:短信通知支持三大运营商以及虚拟运营商,我们提供电信级运维…...
Qt/QML编程学习之心得:一个.qml文件调用另一个.qml文件(十七)
在c++中,一个文件调用另外一个文件最直接最快捷的方式就是#incldue<头文件>的使用,那么在元数据描述性语言QML中,如何从一个界面描述调用另外一个界面描述,一个.qml文件调用另外一个.qml呢?QML虽然有个import,但是用法可以说完全不同于#include。 引用方法1:直接…...
C++_单列模式介绍
介绍 (1)…什么是单例 1.只能有一个实例化的对象的类(2).单例有什么用 1.多线程的线程池的设计 2.系统中只需要一个窗口时才使用单例(无法重复创建) 3.一个操作系统只能有一个文件系统(3).单例怎么用 1.隐藏所有构造函数 2.静态成员内部调用构造函数实例化 3.提供一个静态函数来…...
油烟净化器如何做到高效净化?科技力量,清新餐饮生活
我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 油烟净化器的出现,为我们的餐饮生活注入了一抹清新的色彩。然而,它究竟是如何工作的?为何能…...
【HTML5】HTML5 语音合成
一、前言 前一段时间在项目中需要用到播报文字语音。找到了 HTML 5 有这样的功能。 现在有时间进行总结下。 二、SpeechSynthesis SpeechSynthesis 接口是语音服务的控制接口。它可以用于获取设备上关于可用的合成声音的信息, 开始、暂停语音,或者别…...

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

深度学习中的池化
1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件,池化层经常用在卷积层后边,通过池化来降低卷积层输出的特征向量,避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…...
Java面试整理-Java设计模式
Java中的设计模式通常是从更广泛的面向对象设计模式中借鉴而来的,这些模式旨在解决特定的设计问题和改善代码的可维护性、灵活性和可扩展性。设计模式大致可以分为三类:创建型、结构型和行为型。以下是这三类中一些常见的设计模式: 创建型模式 单例模式(Singleton):确保一…...

用CHAT了解更多知识点
问CHAT:什么是硅基生命和碳基生命? CHAT回复:硅基生命和碳基生命是两种理论性的生物体类型,这些生物体主要是由硅或碳元素以及其他元素构成的。 碳基生命是我们当前所熟知的生命形式。碳元素能够形成稳定且复杂的分子,…...

一个利用摸鱼时间背单词的软件
大家好,我是 Java陈序员。 最近进入了考试季,各种考试,英语四六级、考研、期末考等。不知道大家的英语四六级成绩怎么样呢? 记得大学时,英语四级都是靠高中学习积累的老本才勉强过关。 而六级则是考了多次ÿ…...

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

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...