java实现调用http请求的几种常见方式

概述

在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。
很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。
 在Java项目中调用第三方接口的方式有:1.通过JDK网络类Java.net.HttpURLConnection;2. 通过common封装好的HttpClient;3. 通过Apache封装好的CloseableHttpClient;4. 通过SpringBoot-RestTemplate;

Java调用第三方http接口的方式

通过JDK网络类Java.net.HttpURLConnection
比较原始的一种调用做法,这里把get请求和post请求都统一放在一个方法里面。
实现过程:
GET:
1、创建远程连接
2、设置连接方式(get、post、put。。。)
3、设置连接超时时间
4、设置响应读取时间
5、发起请求
6、获取请求数据
7、关闭连接POST:
1、创建远程连接
2、设置连接方式(get、post、put。。。)
3、设置连接超时时间
4、设置响应读取时间
5、当向远程服务器传送数据/写数据时,需要设置为true(setDoOutput)
6、当前向远程服务读取数据时,设置为true,该参数可有可无(setDoInput)
7、设置传入参数的格式:(setRequestProperty)
8、设置鉴权信息:Authorization:(setRequestProperty)
9、设置参数
10、发起请求
11、获取请求数据
12、关闭连接
package com.xxxx.util.common.httpConnectionUtil;import org.springframework.lang.Nullable;import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;/**
* @author riemann
* @date 2019/05/24 23:42
*/
public class HttpURLConnectionUtil {/*** Http get请求* @param httpUrl 连接* @return 响应数据*/public static String doGet(String httpUrl){//链接HttpURLConnection connection = null;InputStream is = null;BufferedReader br = null;StringBuffer result = new StringBuffer();try {//创建连接URL url = new URL(httpUrl);connection = (HttpURLConnection) url.openConnection();//设置请求方式connection.setRequestMethod("GET");//设置连接超时时间connection.setReadTimeout(15000);//开始连接connection.connect();//获取响应数据if (connection.getResponseCode() == 200) {//获取返回的数据is = connection.getInputStream();if (null != is) {br = new BufferedReader(new InputStreamReader(is, "UTF-8"));String temp = null;while (null != (temp = br.readLine())) {result.append(temp);}}}} catch (IOException e) {e.printStackTrace();} finally {if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}//关闭远程连接connection.disconnect();}return result.toString();}/*** Http post请求* @param httpUrl 连接* @param param 参数* @return*/public static String doPost(String httpUrl, @Nullable String param) {StringBuffer result = new StringBuffer();//连接HttpURLConnection connection = null;OutputStream os = null;InputStream is = null;BufferedReader br = null;try {//创建连接对象URL url = new URL(httpUrl);//创建连接connection = (HttpURLConnection) url.openConnection();//设置请求方法connection.setRequestMethod("POST");//设置连接超时时间connection.setConnectTimeout(15000);//设置读取超时时间connection.setReadTimeout(15000);//DoOutput设置是否向httpUrlConnection输出,DoInput设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个//设置是否可读取connection.setDoOutput(true);connection.setDoInput(true);//设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//拼装参数if (null != param && param.equals("")) {//设置参数os = connection.getOutputStream();//拼装参数os.write(param.getBytes("UTF-8"));}//设置权限//设置请求头等//开启连接//connection.connect();//读取响应if (connection.getResponseCode() == 200) {is = connection.getInputStream();if (null != is) {br = new BufferedReader(new InputStreamReader(is, "GBK"));String temp = null;while (null != (temp = br.readLine())) {result.append(temp);result.append("\r\n");}}}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//关闭连接if(br!=null){try {br.close();} catch (IOException e) {e.printStackTrace();}}if(os!=null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if(is!=null){try {is.close();} catch (IOException e) {e.printStackTrace();}}//关闭连接connection.disconnect();}return result.toString();}public static void main(String[] args) {String message = doPost("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "");System.out.println(message);}
}
通过apache common封装好的HttpClient
httpClient的get或post请求方式步骤:
.生成一个HttpClient对象并设置相应的参数;
.生成一个GetMethod对象或PostMethod并设置响应的参数;
.用HttpClient生成的对象来执行GetMethod生成的Get方法;
.处理响应状态码;
.若响应正常,处理HTTP响应内容;
.释放连接。

导入如下jar包:

<!--HttpClient-->
<dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version>
</dependency><!--fastjson-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.32</version>
</dependency>
package com.riemann.springbootdemo.util.common.httpConnectionUtil;import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;import java.io.IOException;/*** @author riemann* @date 2019/05/25 0:58*/
public class HttpClientUtil {/*** httpClient的get请求方式* 使用GetMethod来访问一个URL对应的网页实现步骤:* 1.生成一个HttpClient对象并设置相应的参数;* 2.生成一个GetMethod对象并设置响应的参数;* 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;* 4.处理响应状态码;* 5.若响应正常,处理HTTP响应内容;* 6.释放连接。* @param url* @param charset* @return*/public static String doGet(String url, String charset) {//1.生成HttpClient对象并设置参数HttpClient httpClient = new HttpClient();//设置Http连接超时为5秒httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);//2.生成GetMethod对象并设置参数GetMethod getMethod = new GetMethod(url);//设置get请求超时为5秒getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置请求重试处理,用的是默认的重试处理:请求三次getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());String response = "";//3.执行HTTP GET 请求try {int statusCode = httpClient.executeMethod(getMethod);//4.判断访问的状态码if (statusCode != HttpStatus.SC_OK) {System.err.println("请求出错:" + getMethod.getStatusLine());}//5.处理HTTP响应内容//HTTP响应头部信息,这里简单打印Header[] headers = getMethod.getResponseHeaders();for(Header h : headers) {System.out.println(h.getName() + "---------------" + h.getValue());}//读取HTTP响应内容,这里简单打印网页内容//读取为字节数组byte[] responseBody = getMethod.getResponseBody();response = new String(responseBody, charset);System.out.println("-----------response:" + response);//读取为InputStream,在网页内容数据量大时候推荐使用//InputStream response = getMethod.getResponseBodyAsStream();} catch (HttpException e) {//发生致命的异常,可能是协议不对或者返回的内容有问题System.out.println("请检查输入的URL!");e.printStackTrace();} catch (IOException e) {//发生网络异常System.out.println("发生网络异常!");} finally {//6.释放连接getMethod.releaseConnection();}return response;}/*** post请求* @param url* @param json* @return*/public static String doPost(String url, JSONObject json){HttpClient httpClient = new HttpClient();PostMethod postMethod = new PostMethod(url);postMethod.addRequestHeader("accept", "*/*");postMethod.addRequestHeader("connection", "Keep-Alive");//设置json格式传送postMethod.addRequestHeader("Content-Type", "application/json;charset=GBK");//必须设置下面这个HeaderpostMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");//添加请求参数postMethod.addParameter("commentId", json.getString("commentId"));String res = "";try {int code = httpClient.executeMethod(postMethod);if (code == 200){res = postMethod.getResponseBodyAsString();System.out.println(res);}} catch (IOException e) {e.printStackTrace();}return res;}public static void main(String[] args) {System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "GBK"));System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");JSONObject jsonObject = new JSONObject();jsonObject.put("commentId", "13026194071");System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject));}
}
通过Apache封装好的CloseableHttpClient
CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。
导入如下jar包:
<!--CloseableHttpClient-->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version>
</dependency><!--fastjson-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.32</version>
</dependency>
package com.riemann.springbootdemo.util.common.httpConnectionUtil;import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.io.UnsupportedEncodingException;/*** @author riemann* @date 2019/05/25 1:35*/
public class CloseableHttpClientUtil {private static String tokenString = "";private static String AUTH_TOKEN_EXPIRED = "AUTH_TOKEN_EXPIRED";private static CloseableHttpClient httpClient = null;/*** 以get方式调用第三方接口* @param url* @param token* @return*/public static String doGet(String url, String token) {//创建HttpClient对象CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpGet = new HttpGet(url);if (null != tokenString && !tokenString.equals("")) {tokenString = getToken();}//api_gateway_auth_token自定义header头,用于token验证使用httpGet.addHeader("api_gateway_auth_token",tokenString);httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");try {HttpResponse response = httpClient.execute(httpGet);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//返回json格式String res = EntityUtils.toString(response.getEntity());return res;}} catch (IOException e) {e.printStackTrace();}return null;}/*** 以post方式调用第三方接口* @param url* @param json* @return*/public static String doPost(String url, JSONObject json) {if (null == httpClient) {httpClient = HttpClientBuilder.create().build();}HttpPost httpPost = new HttpPost(url);if (null != tokenString && tokenString.equals("")) {tokenString = getToken();}//api_gateway_auth_token自定义header头,用于token验证使用httpPost.addHeader("api_gateway_auth_token", tokenString);httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");try {StringEntity se = new StringEntity(json.toString());se.setContentEncoding("UTF-8");//发送json数据需要设置contentTypese.setContentType("application/x-www-form-urlencoded");//设置请求参数httpPost.setEntity(se);HttpResponse response = httpClient.execute(httpPost);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//返回json格式String res = EntityUtils.toString(response.getEntity());return res;}} catch (IOException e) {e.printStackTrace();} finally {if (httpClient != null){try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}return null;}/*** 获取第三方接口的token*/public static String getToken() {String token = "";JSONObject object = new JSONObject();object.put("appid", "appid");object.put("secretkey", "secretkey");if (null == httpClient) {httpClient = HttpClientBuilder.create().build();}HttpPost httpPost = new HttpPost("http://localhost/login");httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");try {StringEntity se = new StringEntity(object.toString());se.setContentEncoding("UTF-8");//发送json数据需要设置contentTypese.setContentType("application/x-www-form-urlencoded");//设置请求参数httpPost.setEntity(se);HttpResponse response = httpClient.execute(httpPost);//这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类//ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class);//把response转为jsonObjectJSONObject result = (JSONObject) JSONObject.parseObject(String.valueOf(response));if (result.containsKey("token")) {token = result.getString("token");}} catch (IOException e) {e.printStackTrace();}return token;}/*** 测试*/public static void test(String telephone) {JSONObject object = new JSONObject();object.put("telephone", telephone);//首先获取tokentokenString = getToken();String response = doPost("http://localhost/searchUrl", object);//如果返回的结果是list形式的,需要使用JSONObject.parseArray转换//List<Result> list = JSONObject.parseArray(response, Result.class);System.out.println(response);}public static void main(String[] args) {test("12345678910");}
}
通过okhttp
应大家的响应,okhttp 现在也是蛮流行的,基于手机端很火,这里分享一下OkHttpClient客户端,业务代码get、post请求直接调用就好哈。
pom文件引入依赖包
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.10.0</version>
</dependency>
@Slf4j
public class OkHttpClient {private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");private volatile static okhttp3.OkHttpClient client;private static final int MAX_IDLE_CONNECTION = Integer.parseInt(ConfigManager.get("httpclient.max_idle_connection"));private static final long KEEP_ALIVE_DURATION = Long.parseLong(ConfigManager.get("httpclient.keep_alive_duration"));private static final long CONNECT_TIMEOUT = Long.parseLong(ConfigManager.get("httpclient.connectTimeout"));private static final long READ_TIMEOUT = Long.parseLong(ConfigManager.get("httpclient. "));/*** 单例模式(双重检查模式) 获取类实例** @return client*/private static okhttp3.OkHttpClient getInstance() {if (client == null) {synchronized (okhttp3.OkHttpClient.class) {if (client == null) {client = new okhttp3.OkHttpClient.Builder().connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS).readTimeout(READ_TIMEOUT, TimeUnit.SECONDS).connectionPool(new ConnectionPool(MAX_IDLE_CONNECTION, KEEP_ALIVE_DURATION,TimeUnit.MINUTES)).build();}}}return client;}public static String syncPost(String url, String json) throws IOException {RequestBody body = RequestBody.create(JSON, json);Request request = new Request.Builder().url(url).post(body).build();try {Response response = OkHttpClient.getInstance().newCall(request).execute();if (response.isSuccessful()) {String result = response.body().string();log.info("syncPost response = {}, responseBody= {}", response, result);return result;}String result = response.body().string();log.info("syncPost response = {}, responseBody= {}", response, result);throw new IOException("三方接口返回http状态码为" + response.code());} catch (Exception e) {log.error("syncPost() url:{} have a ecxeption {}", url, e);throw new RuntimeException("syncPost() have a ecxeption {}" + e.getMessage());}}public static String syncGet(String url, Map<String, Object> headParamsMap) throws IOException {Request request;final Request.Builder builder = new Request.Builder().url(url);try {if (!CollectionUtils.isEmpty(headParamsMap)) {final Iterator<Map.Entry<String, Object>> iterator = headParamsMap.entrySet().iterator();while (iterator.hasNext()) {final Map.Entry<String, Object> entry = iterator.next();builder.addHeader(entry.getKey(), (String) entry.getValue());}}request = builder.build();Response response = OkHttpClient.getInstance().newCall(request).execute();String result = response.body().string();log.info("syncGet response = {},responseBody= {}", response, result);if (!response.isSuccessful()) {throw new IOException("三方接口返回http状态码为" + response.code());}return result;} catch (Exception e) {log.error("remote interface url:{} have a ecxeption {}", url, e);throw new RuntimeException("三方接口返回异常");}}}

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

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

相关文章

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

Linux从入门到精通(第14章 传输文件)

如何在Ubuntu上安装配置NFS_ubuntu 安装nfs-CSDN博客 遇到某些问题&#xff1a; 1、无权限更改文件&#xff1a;sudo -s 2、sudo ifconfig无法识别&#xff1a;sudo apt-get install net-tools 最后的效果是&#xff1a; 在服务端的机器上&#xff1a;rootsword:/nfs_shar…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

基于SSM+JSP的订餐管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

金融疆界:在线支付系统渠道网关的创新设计(一)

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;11.1&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 整个渠道网关的内容预计会分成5篇来讲&#xff1a;1&#xff09;定位、术语、概要设计。2&#xff09;领域模型、状态机设计。3…

数据结构第十三弹---链式二叉树基本操作(上)

链式二叉树 1、结构定义2、手动创建二叉树3、前序遍历4、中序遍历5、后序遍历6、层序遍历7、计算结点个数8、计算叶子结点个数9、计算第K层结点个数10、计算树的最大深度总结 1、结构定义 实现一个数据结构少不了数据的定义&#xff0c;所以第一步需要定义二叉树的机构。 typ…

学习笔记-mysql基础(DDL,DML,DQL)

一.DDL DDL,Data Definition Language,数据库定义语言,该语言包括以下内容: 对数据库的常用操作对表结构的常用操作修改表结构 1.对数据库的常用操作 -- 查看所有的数据库 show databases -- 创建数据库 create database [if not exists] test [charsetutf8] -- 切换 选择 …

__declspec (dllexport)定义了导出函数,但dll中没有此函数

这个一个比较低级的问题&#xff0c;为避免两次犯这样的低级错误&#xff0c;特此记录。 发生这个问题的原因是未包含头文件&#xff0c;例如&#xff1a; test.h //在头文件中声明了导出函数test() #ifdef __cplusplus extern "C" { #endif /*__cplusplus 1*/ext…

记录汇川:H5U与Factory IO测试12

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 辅助出料 子程序&#xff1a; 自动程序 Factory IO配置&#xff1a; 实际动作如下&#xff1a; Factory IO测试12

基于SSM的仓库在线管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

20-链表-删除链表中的节点

这是链表的第20题&#xff0c;力扣链接。 有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。 删除…

ubuntu程序性能分析

文章目录 timeperfvalgrindubuntu 重复执行命令 在Ubuntu上&#xff0c;可以使用一些工具来测量两段程序的计算量&#xff0c;如下所示&#xff1a; time time命令&#xff1a;time命令可以用于测量程序的执行时间。在终端中运行以下命令来执行程序并测量其执行时间&#xff1…

支持向量机(公式推导+举例应用)

文章目录 引言间隔与支持向量机对偶问题&#xff08;拉格朗日乘子法&#xff09;SMO算法核函数软间隔与正则化软间隔正则化&#xff08;罚函数法&#xff09; 模型的稀疏性结论实验分析 引言 在机器学习领域&#xff0c;支持向量机&#xff08;Support Vector Machine&#xf…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

生产数据不备份,用时两行泪

背景&#xff1a;项目使用pg一主一从&#xff0c;因慢sql导致查询慢&#xff0c;所以想从原本的4核加到16核&#xff0c;联系好运维后&#xff0c;打算先从从库开始操作&#xff0c;机器上的pgsql都正常关闭&#xff0c;然后停止&#xff0c;关机&#xff0c;扩容一切都很顺利&…

蓝桥杯基础数据结构(java版)

引言 数据结构数据结构。所以数据结构是一个抽象的概念。其目的是为了更好的组织数据方便数据存储。下面我们来看一些简单的数据储存方式 输入和输出 这里先介绍java的输入和输出。简单引入&#xff0c;不过多详细介绍&#xff0c;等我单一写一篇的时候这里会挂上链接 简单的…

OpenCV-Python(34):FAST算法

目标 理解 FAST 算法的基础使用OpenCV 中的FAST 算法相关函数进行角点检测 介绍 FAST算法&#xff08;Features from Accelerated Segment Test&#xff09;是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法&#xff0c;具有高效、准确的特点&#xff0c;常…

【算法分析与设计】最短路径和

题目&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],…

【PHP AES加解密示例】从入门到精通,一篇文章让你掌握加密解密技术!

一、引言 随着互联网的普及&#xff0c;数据安全问题越来越受到人们的关注。在众多加密算法中&#xff0c;AES&#xff08;Advanced Encryption Standard&#xff09;因其高效、安全的特点被广泛应用。本文将通过PHP语言&#xff0c;为大家展示一个简单的AES加解密示例&#x…

Retinal Structure Detection in OCTA Image viaVoting-Based Multitask Learning

一、摘要 研究背景&#xff1a;自动检测视网膜结构&#xff0c;如视网膜血管(RV)、中央凹血管区(FAZ)和视网膜血管连接(RVJ)&#xff0c;对了解眼部疾病和临床决策具有重要意义。 主要工作&#xff1a;在本文中&#xff0c;提出了一种新的基于投票的自适应特征融合多任务网络…