基于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--引言 最近加入到一个项目组,有一些测试需要去支持,通过了解原先团队的测试方法后,自己作了如下改善,大大提高了工作效率。这也许就是软件开发的意义吧,能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
