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

[Java]_[中级]_[使用okhttp3和HttpClient代理访问外部网络]

场景

  1. Javahttp库常用的有HttpClientOkhttp3, 如果公司有限制网络访问,需要代理才可以访问外网,那么如何使用代理Proxy
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version>
</dependency>

说明

  1. 从性能方面来说,Okhttp3更出色一点。因为从我本机运行两个库的访问, Okhttp3会快一些。

  2. 从易用性来说,Ohttp3更好。OkHttpClient只需要在Builder里调用proxy(Proxy)传递一个Proxy对象之后即可。之后访问其他外网,就直接创建外网的Request即可,非常方便。 代理和非代理都用统一的方法。

    OkHttpClient.Builder builder = client.newBuilder();
    builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostName, Integer.parseInt(hostPort))));...
    Response response = getClient().newCall(request).execute()
    
  3. HttpClient访问[1]则需要创建两个对象: 需要访问的主机HttpHost和URL里的请求路径和查询参数的HttpGet对象。 每次请求都需要传递这两个参数。而如果非代理的话,就需要调用另外的重载方法。

     HttpHost target = HttpHost.create(hostUrl);
    HttpGet request = new HttpGet("/user?name=xxx");
    //  HttpGet httpGet = new HttpGet(hostUrl); // 非代理...
    httpClient.execute(target, request) // 代理
    // httpClient.execute(httpGet); // 非代理
    
  4. 注意,出于创建Client比较废资源,okhttp3还是HttpClient官方都是推荐创建单例的OkHttpClientHttpClient对象来使用。对于CloseableHttpClient在使用完之后还需要调用close()关闭。OkHttpClient官方例子也没有调用销毁方法。

  5. 从源码设计上来说,Okhttp3在发送数据时,使用了自带的线程池,我们想用自己的线程池代替都不行。这个对某些线程数有严格限制的程序(Linux)非常不友好,甚至不能用,因为它的线程不受宿主程序控制。

    // 在类 RealConnectionPool里有这段代码
    static {executor = new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(), Util.threadFactory("OkHttp ConnectionPool", true));
    }
    

例子

  1. 以下是使用okhttp3HttpClient的目前最佳做法.

OkHttpClientCaller


import Pair;
import StringUtils;
import HttpHelper;
import okhttp3.*;
import org.apache.log4j.Logger;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Map;public class OkHttpClientCaller {private static Logger logger = Logger.getLogger(OkHttpClientCaller.class);private static OkHttpClient client;public static void newClient(){OkHttpClient.Builder builder = new OkHttpClient().newBuilder();client = builder.cookieJar(new LocalCookieJar()).build();}public static void setProxy(String hostName,String hostPort){Proxy proxy = client.proxy();if(StringUtils.isEmpty(hostName,hostPort)){if(proxy != null) {client.newBuilder().proxy(null).cookieJar(new LocalCookieJar()).build();}}else{if(proxy == null){OkHttpClient.Builder builder = client.newBuilder();builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostName, Integer.parseInt(hostPort))));client = builder.cookieJar(new LocalCookieJar()).build();}}}public static OkHttpClient getClient(){return client;}public static Pair<Boolean,String> doGet(Map<String,String> hostHeaders,String hostUrl){Request.Builder builder = new Request.Builder().url(hostUrl);HttpHelper.buildRequestHeader(builder,hostHeaders);Request request = builder.get().build();try (Response response = getClient().newCall(request).execute()) {return new Pair<>((response.code() == 200), response.body().string());} catch (Exception e) {logger.error(e.getMessage());}return new Pair<>(false,"");}/**** @param apiUrl* @param apiHeaders* @param contentType "application/x-www-form-urlencoded" "application/json"* @param content* @return*/public static Pair<Boolean,String> doPost(String apiUrl,Map<String,String> apiHeaders,String contentType,String content){// HeaderRequest.Builder builder = new Request.Builder().url(apiUrl);HttpHelper.buildRequestHeader(builder,apiHeaders);MediaType mediaType = MediaType.parse(contentType);RequestBody body = RequestBody.create(mediaType,content);// Posttry(Response response = getClient().newCall(builder.post(body).build()).execute()){return new Pair<>((response.code() == 200), response.body().string());} catch (IOException e) {logger.error(e.getMessage());}return new Pair<>(false,"");}public static Pair<Boolean,String> doPostFormData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/x-www-form-urlencoded",content);}public static Pair<Boolean,String> doPostJsonData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/json",content);}
}

HttpClientCaller


import Pair;
import StringUtils;
import RequestUtils;
import HttpHelper;
import org.apache.http.HttpHost;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
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.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;import static RequestUtils.getPathAndQueryParam;
import static RequestUtils.getPort;public class HttpClientCaller {private static Logger logger = Logger.getLogger(HttpClientCaller.class);private static CloseableHttpClient httpClient;private static RequestConfig requestConfig;//传输超时时间, 10秒private static int socketTimeout = 10000;//建立连接超时时间,默认10秒private static int connectTimeout = 5000;//获取连接超时时间,10秒private static int connectRequest = 5000;private static HttpHost proxy = null;private static HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {@Overridepublic boolean retryRequest(IOException exception,int executionCount, HttpContext context) {return false;}};public static CloseableHttpClient createClientAttr(HttpClientBuilder builder){return builder.setRetryHandler(myRetryHandler).setMaxConnPerRoute(2).setMaxConnTotal(2).build();}public static void newClient() {// setMaxConnTotal是连接池中可用的总最大连接数。setMaxConnPerRoute是限制到单个端口或url的连接总数。httpClient = createClientAttr(HttpClients.custom());//根据默认超时限制初始化requestConfigrequestConfig = getCommonRequestConfigBuilder().build();}public static RequestConfig.Builder getCommonRequestConfigBuilder(){RequestConfig.Builder builder = RequestConfig.custom().setConnectionRequestTimeout(connectRequest).setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout);return builder;}/*** 不行: https://blog.csdn.net/woshirongshaolin/article/details/126992654* @return*/public static SSLConnectionSocketFactory createSSLFactory(){//使用 loadTrustMaterial() 方法实现一个信任策略,信任所有证书try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {// 信任所有public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {return true;}}).build();//NoopHostnameVerifier类:  作为主机名验证工具,实质上关闭了主机名验证,它接受任何//有效的SSL会话并匹配到目标主机。HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);return sslsf;} catch (NoSuchAlgorithmException e) {logger.error(e.getMessage());} catch (KeyManagementException e) {logger.error(e.getMessage());} catch (KeyStoreException e) {logger.error(e.getMessage());}return null;}/**** @param hostName* @param port*/public static void setProxy(String hostName,String port){// 不支持// https://github.com/apache/httpcomponents-client/blob/4.5.x/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteProxy.javaif(StringUtils.isEmpty(hostName,port)){if(proxy != null)requestConfig = getCommonRequestConfigBuilder().setProxy(null).build();}else{if(proxy == null){closeClient();SSLConnectionSocketFactory sslFactory = createSSLFactory();if(sslFactory != null)httpClient = createClientAttr(HttpClients.custom().setSSLSocketFactory(sslFactory));proxy = new HttpHost(hostName, Integer.parseInt(port));requestConfig = getCommonRequestConfigBuilder().setProxy(proxy).build();}}}public static void closeClient(){try {if(httpClient != null)httpClient.close();httpClient = null;} catch (Exception e) {e.printStackTrace();}}public static RequestConfig getRequestConfig(){return requestConfig;}public static CloseableHttpClient getClient(){return httpClient;}public static Pair<Boolean,String> doGet(Map<String,String> hostHeaders, String hostUrl){if(proxy != null){URL url = RequestUtils.getUrlOrNull(hostUrl);HttpHost target = new HttpHost(url.getHost(), getPort(url),url.getProtocol());HttpGet request = new HttpGet(getPathAndQueryParam(url));request.setConfig(requestConfig);HttpHelper.buildRequestHeader(request,hostHeaders);try(CloseableHttpResponse response = httpClient.execute(target, request);){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));}catch ( IOException e){e.printStackTrace();}}else{HttpGet httpGet = new HttpGet(hostUrl);httpGet.setConfig(requestConfig);HttpHelper.buildRequestHeader(httpGet,hostHeaders);try(CloseableHttpResponse response = httpClient.execute(httpGet);){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));}catch ( IOException e){e.printStackTrace();}}return new Pair<>(false,"");}public static Pair<Boolean,String> doPost(String apiUrl,Map<String,String> apiHeaders,String contentType,String content) {if(proxy != null){URL url = RequestUtils.getUrlOrNull(apiUrl);HttpHost target = new HttpHost(url.getHost(), getPort(url),url.getProtocol());HttpPost post = new HttpPost(getPathAndQueryParam(url));HttpHelper.buildRequestHeader(post,apiHeaders);if(post.getFirstHeader("Content-Type") == null)post.addHeader("Content-Type",contentType);StringEntity postEntity = new StringEntity(content, "UTF-8");post.setEntity(postEntity);post.setConfig(requestConfig);try(CloseableHttpResponse response = httpClient.execute(target,post)){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));} catch (IOException e) {logger.warn(e.getMessage());}}else{HttpPost post = new HttpPost(apiUrl);HttpHelper.buildRequestHeader(post,apiHeaders);if(post.getFirstHeader("Content-Type") == null)post.addHeader("Content-Type",contentType);StringEntity postEntity = new StringEntity(content, "UTF-8");post.setEntity(postEntity);post.setConfig(requestConfig);try(CloseableHttpResponse response = httpClient.execute(post)){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));} catch (IOException e) {logger.warn(e.getMessage());}}return  new Pair<>(false,"");}public static Pair<Boolean,String> doPostFormData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/x-www-form-urlencoded; charset=UTF-8",content);}public static Pair<Boolean,String> doPostJsonData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/json; charset=UTF-8",content);}
}

HttpHelper


import okhttp3.Request;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.message.AbstractHttpMessage;import java.util.Map;public class HttpHelper {public static void buildRequestHeader(AbstractHttpMessage builder, Map<String,String> values){for (Map.Entry<String,String> keyValue:values.entrySet()) {builder.addHeader(keyValue.getKey(),keyValue.getValue());}}public static void buildRequestHeader(Request.Builder builder,Map<String,String> values){for (Map.Entry<String,String> keyValue:values.entrySet()) {builder.addHeader(keyValue.getKey(),keyValue.getValue());}}public static String toFormData(Map<String,String> params){StringBuilder sb = new StringBuilder();for (Map.Entry<String,String> keyValue: params.entrySet())sb.append(keyValue.getKey()).append("=").append(keyValue.getValue()).append("&");if(sb.length() > 0)return sb.substring(0,sb.length()-1);return "";}
}

RequestUtils

import java.net.MalformedURLException;
import java.net.URL;public class RequestUtils {/**** @param url* @return URL or null*/public static URL getUrlOrNull(String url){try {return new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}return null;}public static int getPort(URL url){int port = url.getPort();return (port == -1)?url.getDefaultPort():port;}public static String getPathAndQueryParam(URL url){String path = url.getPath();String query = url.getQuery();if(query == null)return path;return String.format("%s?%s",path,query);}
}

运行

OkHttpClientCaller.newClient();
OkHttpClientCaller.setProxy("127.0.0.1","1283");
Pair<Boolean, String> pp = OkHttpClientCaller.doGet(headers, "https://www.bing.com");
if(pp.k)logger.info(pp.v);OkHttpClientCaller.closeClient();

参考

  1. httpcomponents-client/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteProxy.java

  2. Httpclient3.1指定tlsv1.2协议访问https

  3. java http请求设置代理 Proxy_java

  4. RestTemplate发起HTTPS请求Unsupported or unrecognized SSL message

  5. HttpClient访问不安全的https链接报错:SSLHandshakeException

  6. httpclient信任所有证书解决SSLException:Unrecognized SSL message

  7. Java URI getQuery()方法及示例

相关文章:

[Java]_[中级]_[使用okhttp3和HttpClient代理访问外部网络]

场景 Java的http库常用的有HttpClient和Okhttp3, 如果公司有限制网络访问&#xff0c;需要代理才可以访问外网&#xff0c;那么如何使用代理Proxy&#xff1f; <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient<…...

ubuntu 20.04 docker 安装 mysql

要在Ubuntu 20.04上安装Docker并运行MySQL容器&#xff0c;您可以按照以下步骤操作&#xff1a; 1.更新系统包列表&#xff1a; sudo apt update2.安装Docker&#xff1a; sudo apt install docker.io3.启动Docker服务并设置其开机自启动&#xff1a; sudo systemctl start…...

C++在C语言基础上的优化

目录 一、命名空间 1、命名空间的定义 2、命名空间的使用 二、输入&输出 三、缺省参数 1、缺省参数的概念 2、缺省参数的分类 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3、引用和指针的区别 六、内联函数 七、基于范围的for循环 一、命名空间 命名空…...

分享一个python实验室设备预约管理系统 实验室设备维修系统源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

兵者多诡(HCTF2016)

环境:https://github.com/MartinxMax/CTFer_Zero_one 题目简介 解题过程 登录首页 提交png图片上传抓包&#xff0c;可以看到是向upload文件提交数据 在fp参数中尝试伪协议读取home.php文件 http://127.0.0.1:88/HCTF2016-LFI/home.php?fpphp://filter/readconvert.base64…...

【JAVA-Day04】Java关键字和示例:深入了解常用关键字的用法

Java关键字和示例&#xff1a;深入了解常用关键字的用法 摘要Java 关键字、标识符和命名规范一、Java 关键字常用关键字DEMO1. 示例代码使用 if 和 else 关键字&#xff1a;2. 示例代码使用 for 循环&#xff1a;3. 示例代码使用 switch 关键字&#xff1a;4. 示例代码使用 wh…...

Android请求网络报错:not permitted by network security policy

一、错误记录 https的接口请求正常的&#xff0c; 请求http的接口时报错&#xff1a;not permitted by network security policy 二、问题分析 原因&#xff1a; 由于 Android P(版本27以上) 限制了明文流量的网络请求&#xff0c;非加密的流量请求都会被系统禁止掉。如果当…...

python报错:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1

python报错&#xff1a;ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 问题分析 说明&#xff1a;requests包引入了urllib3&#xff0c;而新版本的urllib3 需要OpenSSL 1.1.1以上版本&#xff0c;否则报错&#xff1a; ImportError: urllib3 v2.0 only supports Ope…...

如何使用adb command来设置cpu频率和核数

透過ADB Shell設定CPU開核與freq的command與用法如下: # Disable PPM echo 0 > /proc/ppm/enabled # Enable PPM (Default) echo 1 > /proc/ppm/enabled echo 0 > /proc/ppm/enabled Fixed # Core for each cluster echo X Y > /proc/ppm/policy/ut_fix_core_num …...

236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 题目-中等难度示例1. dfs 题目-中等难度 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p…...

Git常见问题:git pull 和 git pull --rebase二者区别

git pull 和 git pull --rebase 都是从远程仓库获取最新的更改并将其合并到本地分支。但它们之间的区别在于合并方式。以下是它们之间的主要区别&#xff1a; git pull&#xff1a; 当你执行 git pull 时&#xff0c;Git 会执行以下两个操作&#xff1a; git fetch&#xff…...

关于HarmonyOS元服务的主题演讲与合作签约

一、感言 坚持中&#xff0c;总会有很多意想不到的收获。 前几次参与HDC时更多的是观众、开发者、专家的身份&#xff0c;以参观、学习、交流为主。 通过几年的努力&#xff0c;和HarmonyOS功能成长&#xff0c;在2023年的HDC大会中&#xff0c;有了我的演讲&#xff0c;并带领…...

cache 学习

好文章&#xff1a; Cache的基本原理 - 知乎...

SSM - Springboot - MyBatis-Plus 全栈体系(六)

第二章 SpringFramework 四、SpringIoC 实践和应用 3. 基于 注解 方式管理 Bean 3.1 实验一&#xff1a;Bean 注解标记和扫描 (IoC) 3.1.1 注解理解 和 XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框…...

【Flutter】引入网络图片时,提示:Failed host lookup: ‘[图片host]‘

在使用 NetworkImage 组件加载外部图片时&#xff0c;提示 Failed host lookup: [图片host] 错误。 排查方向 1、清理缓存 解决方案&#xff1a; 尝试flutter clean清空缓存后重新安装依赖flutter pub get重新构建项目flutter create . 走完上述三个步骤后&#xff0c;再次…...

Python基础教程:索引和切片

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 索引&#xff08;下标&#xff09; 索引又称下标&#xff0c;用来表示可迭代对象中的某个元素的位置。 用正整数表示的索引值&#xff0c;从左向右定位&#xff0c;从 0 开始计数&#xff0c;如 0&#xff0c;1&#…...

JVM基础面试题

JDK、JRE、JVM的关系 JVM Java虚拟机&#xff0c;它只识别.class类型文件&#xff0c;它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。 JRE Java运行时环境。它主要包含两部分&#xff1a;Jvm的标准实现和Java的一些基本类库。相对于JVM来说,JRE多出来…...

蓝桥杯官网填空题(平方末尾)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 能够表示为某个整数的平方的数字称为“平方数” 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。 因为平方数的末位只可能是&#x…...

深入探究数据结构与算法:构建强大编程基础

文章目录 1. 为什么学习数据结构与算法&#xff1f;1.1 提高编程技能1.2 解决复杂问题1.3 面试准备1.4 提高代码效率 2. 学习资源2.1 经典教材2.2 在线学习平台2.3 学习编程社区 3. 数据结构与算法的实际应用3.1 排序算法3.2 图算法3.3 字符串匹配算法 4. 结论 &#x1f389;欢…...

Android 自定义View之圆形进度条

很多场景下都用到这种进度条&#xff0c;有的还带动画效果&#xff0c; 今天我也来写一个。 写之前先拆解下它的组成&#xff1a; 底层圆形上层弧形中间文字 那我们要做的就是&#xff1a; 绘制底层圆形&#xff1b;在同位置绘制上层弧形&#xff0c;但颜色不同&#xff…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...