SpringBoot调用HTTP接口

1. RestTemplate

首先引入依赖

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

编写配置类

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);//单位为msfactory.setConnectTimeout(5000);//单位为msreturn factory;}
}

SimpleClientHttpRequestFactory类对应的HTTP库是JDK自带的HttpUrlConnection,也可以修改使用其他的HTTP库,例如HttpComponentsAsyncClientHttpRequestFactory。

这样就可以注入使用了

    @Resourceprivate RestTemplate restTemplate;
      String url = "http://127.0.0.1/test";// 请求参数Map map = new HashMap<>();map.put("key", "111");// 设置请求头属性HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);HttpEntity httpEntity = new HttpEntity(map, httpHeaders);String results = restTemplate.postForObject(url, httpEntity, String.class);

2. WebClient

 Spring3.0引入了RestTemplate,WebClient是Spring Framework的一部分,但是在后来的官方源码中介绍,RestTemplate有可能在未来的版本中被弃用,所谓替代RestTemplate,在Spring5中引入了WebClient作为异步的非阻塞、响应式的HTTP客户端。

依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

使用

public class TestWebClient {@Testpublic void doGet() {String userId = "郭郭";String url = "http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId={userId}";Mono<String> mono = WebClient//创建WebClient实例.create()//方法调用,WebClient中提供了多种方法.get()//请求url.uri(url, userId)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果:block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println("响应结果:" + mono.block());}@Testpublic void doPost() {Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);String url = "http://127.0.0.1:8094/masterdata/sysUser/saveUser";Mono<String> mono = WebClient//创建WebClient实例.create()//方法调用,WebClient中提供了多种方法.post()//请求url.uri(url)//指定请求的Content-Type为JSON.contentType(MediaType.APPLICATION_JSON)//使用bodyValue方法传递请求体.bodyValue(requestBody)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果:block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println("响应结果:" + mono.block());}
}

 在上述doPost请求中,我们的请求接口入参是一个Map,但是需要转换为JSON格式传递,这是因为WebClient默认是使用JSON序列化的。

3.Apache HttpClient

引入依赖

 <!-- 此处使用的是 5.x 版本,可以根据自身情况引入版本 --><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.1.1</version></dependency>
//步骤一:方式1获取默认配置的httpClient实例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 方式2根据系统配置创建 HttpClient
// CloseableHttpClient httpClient = HttpClients.createSystem();
// 在项目启动时可以通过设置如下JVM启动参数:
// http.agent 配置 userAgent
// http.keepAlive 配置 keepAlive 数据
// 方式3自定义创建全局配置
// CloseableHttpClient httpClient = HttpClients.custom()
// .setDefaultHeaders(Collections.emptyList()) // 设置默认请求头
// .setDefaultRequestConfig(RequestConfig.DEFAULT) // 设置默认配置
// .build();// 设置默认请求头
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON));
headers.add(new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, x-gzip, deflate"));
headers.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive"));
httpClient .setDefaultHeaders(headers) 
//步骤二:创建HTTP请求
HttpGet httpGet = new HttpGet("http://127.0.0.1:8080/masterdata/sysUser/getSysUserById?userId=张三");// 创建请求配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 设置连接超时时间
.setConnectTimeout(Timeout.of(3000, TimeUnit.MILLISECONDS))
// 设置响应超时时间
.setResponseTimeout(3000, TimeUnit.MILLISECONDS)
// 设置从连接池获取链接的超时时间
.setConnectionRequestTimeout(3000, TimeUnit.MILLISECONDS)
.build();
// 设置请求参数
httpGet.setConfig(requestConfig);
// 添加 Content-Type 请求头
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_FORM_URLENCODED);
// 添加 accept 请求头
httpPost.addHeader(new BasicHeader(HttpHeaders.ACCEPT, "*/*"));
//步骤三:发送请求并获取响应数据
CloseableHttpResponse response = httpClient.execute(httpGet);
// 获取请求状态
int code = response.getCode();
//步骤四:处理响应数据
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
//步骤五:关闭httpClient和response
response.close();
httpClient.close();

 通过 URIBuilder 构建请求路径

// 构建请求路径,及参数
URL url = new URL("http://localhost:10010/user/params");
URI uri = new URIBuilder()
.setScheme(url.getProtocol())
.setHost(url.getHost())
.setPort(url.getPort())
.setPath(url.getPath())
// 构建参数
.setParameters(
new BasicNameValuePair("name", "张三"),
new BasicNameValuePair("age", "20")
).build();
​
// 创建 GET 请求对象
HttpGet httpGet = new HttpGet(uri);
// 调用 HttpClient 的 execute 方法执行请求
CloseableHttpResponse response = httpClient.execute(httpGet);
// 获取请求状态
int code = response.getCode();
// 如果请求成功
if(code == HttpStatus.SC_OK){
http://LOGGER.info("响应结果为:{}", EntityUtils.toString(response.getEntity()));
}

发送 JSON 数据

HttpClient 中发送 JSON 数据可以使用 StringHttpEntity 类实现,如下所示:
// 请求参数
String url = "http://localhost:10010/user/body";
// 创建 GET 请求对象
HttpPost httpPost = new HttpPost(url);
// 构建对象
User user = new User();
user.setName("张三")
.setAge(20)
.setAddress(new Address()
.setCounty("中国")
.setCity("北京"))
.setAihao(Arrays.asList("跑步", "爬山", "看书"));
​
// 创建 字符串实体对象
HttpEntity httpEntity = new StringEntity(JSON.toJSONString(user));
httpPost.setEntity(httpEntity);
​
// 发送 POST 请求
httpClient.execute(httpPost);

模拟form表单数据 

// 修改 contentType
// 创建 ContentType 对象为 form 表单模式
ContentType contentType = ContentType.create("application/x-www-form-urlencoded", StandardCharsets.UTF_8);
// 添加到 HttpPost 头中
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, contentType);
创建请求数据 HttpEntity
// 方式一、自己拼接请求数据,并且创建 StringEntity 对象
String query = "name="+ URLEncoder.encode("张三", "utf-8") +"&age=20";
HttpEntity httpEntity = new StringEntity(query);
​
// 方式二、通过UrlEncodedFormEntity 创建 HttpEntity
HttpEntity httpEntity = new UrlEncodedFormEntity(
Arrays.asList(new BasicNameValuePair("name", "张三"),
new BasicNameValuePair("age", "20")),
StandardCharsets.UTF_8
);
​
// 把 HttpEntity 设置到 HttpPost 中
httpPost.setEntity(httpEntity);

 上传

 //要上传的文件File file = new File("F:/20150703212056_Yxi4L.jpeg");​// 创建对象MultipartEntityBuilder builder = MultipartEntityBuilder.create();​// 添加二进制消息体builder.addBinaryBody("file", file);​// 也可以添加文本消息ContentType contentType = ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8);builder.addTextBody("name", "张三", contentType);​// 通过 MultipartEntityBuilder 构建消息体HttpEntity httpEntity = builder.build();HttpPost httpPost = new HttpPost("http://localhost:10010/user/upload");httpPost.setEntity(httpEntity);CloseableHttpResponse response = httpClient.execute(httpPost);// 获取请求状态int code = response.getCode();// 如果请求成功if(code == HttpStatus.SC_OK){LOGGER.info("响应结果为:{}", EntityUtils.toString(response.getEntity()));}

下载

 // 请求下载路径HttpGet httpGet = new HttpGet("http://localhost:10010/user/downLoad");CloseableHttpResponse response = httpClient.execute(httpGet);​// 如果请求成功if (response.getCode() == HttpStatus.SC_OK){​// 获取下载文件的文件名,此处的 File-Name 头信息,需要在服务端进行自定义Header header = response.getFirstHeader("File-Name");String value = header.getValue();​// 读取数据byte[] bytes = EntityUtils.toByteArray(response.getEntity());try (OutputStream outputStream = new FileOutputStream("F:/" + value);){outputStream.write(bytes);outputStream.flush();}}

响应处理

 // 转换为字符串EntityUtils.toString(response.getEntity());​// 转换为字节数组EntityUtils.toByteArray(response.getEntity());

 自定义响应对象

@Data@Accessors(chain = true)class  Response {// 响应状态private int code;// 响应描述private String msg;// 响应体private String body;}​// 调用  execute 时自定义 响应处理类Response execute = httpClient.execute(httpGet, response -> {return new Response().setCode(response.getCode()).setMsg(response.getReasonPhrase()).setBody(EntityUtils.toString(response.getEntity(),                 StandardCharsets.UTF_8));});

 会话保持

// 创建 HttpClientContext对象HttpContext httpContext = new BasicHttpContext();httpContext.setAttribute("name", "zhangsan");HttpClientContext httpClientContext = HttpClientContext.adapt(httpContext);​// 登录httpClient.execute(new HttpPost(""), httpClientContext);​// 获取数据httpClient.execute(new HttpGet(""), httpClientContext);

4. OkHttp

具有低内存占有和出色的性能

引入依赖

  <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.0.0</version></dependency>

5. HttpURLConnection

Java 自带的一个 HTTP 客户端工具

示例:

 @Testpublic void doGet() throws IOException {String userId = "张三";  // 参数值userId = URLEncoder.encode(userId, "UTF-8"); // 对参数值进行URL编码//步骤一:创建URL对象URL url = new URL("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId=" + userId);//步骤二:打开连接 HttpURLConnection继承自URLConnection,是它的一个子类,//而HttpURLConnection专门用于处理HTTP协议的连接,如果需要处理其他协议使用通用的URLConnection。HttpURLConnection conn = (HttpURLConnection) url.openConnection();//步骤三:设置请求方式conn.setRequestMethod("GET");//步骤四:读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println(sb.toString());} @Testpublic void doPost() throws IOException {//创建URL对象URL url = new URL("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设置请求方式conn.setRequestMethod("POST");// 设置请求头conn.setRequestProperty("Content-Type", "application/json");//启用输出流//告诉连接对象您将使用输出流来发送数据,这样它会准备好接受输出流,并将数据发送到服务器。//这是发送POST请求体数据所必需的步骤。get没有请求体不需要conn.setDoOutput(true);//设置请求体数据Map map = new HashMap<>();map.put("name", "张三");String requestBody = JSON.toJSONString(map);//发送请求体数据try (DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream())) {outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));}//读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println(sb.toString());} 

6. FeignClient

引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在 spring boot 启动类加上@EnableFeignClients注解

// name:指定Feign的名称,如果使用了注册中心,name属性会作为微服务的名称,用于服务发现
// url:Feign调用的跳转路径,可以在配置文件中设置,多用于代码调试
@FeignClient(name = "masterdata",url = "${masterdata-service-url}")
public interface ISysUserClient {@GetMapping(value = "/masterdata/getSysUserById")public Map getSysUserById(@RequestParam("userId") String userId);
}

默认是连接超时10s,读超时60s ,feign 集成了 ribbon 和 hystrix,feign 本身不带超时限制,其超时是由 ribbon 和 hystrix 控制的。

## 方法一:设置在ribbon上
ribbon:OkToRetryOnAllOperations: false #对所有操作请求都进行重试,默认falseReadTimeout: 5000   #负载均衡超时时间,默认值5000ConnectTimeout: 3000 #ribbon请求连接的超时时间,默认值2000MaxAutoRetries: 0     #对当前实例的重试次数,默认0MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1## 方法二:设置在feign client上
feign:client:config:default:connectTimeout: 5000readTimeout: 3000

7. AsyncHttpClient

AsyncHttpClient是一个独立的开源库,它不依赖于任何的框架或者技术栈

依赖:

<dependency><groupId>org.asynchttpclient</groupId><artifactId>async-http-client</artifactId><version>2.12.3</version>
</dependency>

示例:

public class TestAsyncHttpClient {@Testpublic void doGet() throws IOException {try (AsyncHttpClient client = new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder = client.prepareGet("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId=郭郭");CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody = future.join();System.out.println(responseBody);}}@Testpublic void doPost() throws IOException {try (AsyncHttpClient client = new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder = client.preparePost("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//requestBody请求入参Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);requestBuilder.addHeader("Content-Type", "application/json");requestBuilder.setBody(requestBody);CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody = future.join();System.out.println(responseBody);}}}

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

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

相关文章

Git拉取远程仓库代码覆盖本地,也就是放弃本地修改

git撤销本地 、强制拉取远程代码覆盖本地-CSDN博客 说的最多的是用&#xff1a;git fetch --all 但是亲测是无效的&#xff0c;并不能将本地不存在但远程仓库存在的文件取回来。就是git fetch 项目地址&#xff0c;也是没用的&#xff01; 就算是重新pull整个项目&#xff0…

Django中间件

目录 一.介绍 1.什么是Django中间件 2.作用&#xff1a; 3.示例 二.Django请求生命周期流程图 三.Django中间件是Django的门户 四.中间件方法 1.必须掌握的中间件方法 &#xff08;1&#xff09;process_request: 示例&#xff1a; 2.需要了解的中间件方法 &#x…

新生儿散光:原因、科普和注意事项

引言&#xff1a; 散光是一种常见的眼睛问题&#xff0c;虽然在新生儿时期相对较少见&#xff0c;但了解其原因、科普相关知识&#xff0c;并提供一些建议的注意事项&#xff0c;对于婴儿的视力健康至关重要。本文将深入探讨新生儿散光的原因、相关科普知识&#xff0c;并为父…

大厂前沿技术导航

百度Geek说 - 知乎 腾讯技术 - 知乎 美团技术团队

YaRN方法:无需微调,高效扩展语言模型上下文窗口/蚂蚁集团与浙大发布原生安全框架v1.0,引领企业网络安全新时代 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 YaRN方法&#xff1a;无需微调&#xff0c;高效扩展语言模型上下文窗口 蚂蚁…

2023 hnust 湖南科技大学 信息安全管理课程 期中考试 复习资料

前言 ※老师没画重点的补充内容★往年试卷中多次出现或老师提过的&#xff0c;很可能考该笔记是奔着及格线去的&#xff0c;不是奔着90由于没有听过课&#xff0c;部分知识点不一定全&#xff0c;答案不一定完全正确 题型 试卷有很多题是原题 判断题&#xff08;PPT&#xff…

python-冒泡排序

冒泡排序 &#xff08;稳定&#xff09; O(n^2) (稳定&#xff1a;表示相等的数&#xff0c;相对位置会不会改变) 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过多次遍历待排序的元素&#xff0c;比较相邻两个元素的大小并交换它们&…

Kafka 常用功能总结(不断更新中....)

kafka 用途 业务中我们经常用来两个方面 1.发送消息 2.发送日志记录 kafka 结构组成 broker&#xff1a;可以理解成一个单独的服务器&#xff0c;所有的东西都归属到broker中 partation&#xff1a;为了增加并发度而做的拆分&#xff0c;相当于把broker拆分成不同的小块&…

党建信息管理系统源码 支持在线交党费 附带完整的搭建教程

传统的党建管理模式通常采用手工方式&#xff0c;不仅效率低下&#xff0c;而且容易出错。随着组织规模的扩大和党员数量的增加&#xff0c;这种管理方式已经无法满足现实需求。此外&#xff0c;传统的党建管理模式缺乏在线交党费功能&#xff0c;给党员带来不便。因此&#xf…

Kubernetes 离线部署 Spinnaker

离线部署 Spinnaker 离线部署 spinnaker 需要提前准备以下依赖项 halyard 安装工具&#xff1a;该hal命令的apt源地址https://us-apt.pkg.dev/projects/spinnaker-community位于国外halyard boms物料清单&#xff1a;Spinnaker 将其halyard boms配置存储在公共谷歌云存储 ( g…

Divisibility Trick

Dmitry最近学会了一个简单的规则来检查一个整数是否可以被3整除。如果一个整数的位数之和可以被3整除&#xff0c;那么它就可以被3所整除。 后来他还了解到&#xff0c;同样的规则也可以用来检查一个整数是否可以被9整除。如果一个整数的位数之和可以被9整除&#xff0c;那么它…

如何在 Web 应用程序中查找端点?

如何在 Web 应用程序中查找端点? 这篇文章主要讲述了如何在网络应用中找到端点。以下是文章的主要要点: 端点是网络服务的访问地址,通过引用这个URL,客户可以访问服务提供的操作。端点提供了寻址Web服务端点所需的信息。 HTTP消息是服务器和客户端之间交换数据的方式,包…

Anaconda深度学习环境配置命令参考

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Anaconda深度学习环境配置 Anaconda 管理1. 检查 Anaconda 版本2. 获取版本号3. 列出所有的虚拟环境4. 查看环境管理的全部命令帮助5. conda升级6. conda升级后释放空间 Anac…

2024免费MacBook清理工具CleanMyMac X4.15

CleanMyMac X 是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级 Mac 上的应用。同时 CleanMyMac X 可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化 Mac 系统&…

竞赛知识点12【树状数组】

文章目录 1、思路引入2、求lowbit(n)3、对某个元素进行加法操作(单点更新)4、查询前缀和5、统计A[x]~A[y] 的值1、思路引入 如果线段树每个节点维护的是对应区间的和,比如说计算从 s s s 到 t t t 的和 ( a s + … + a t ) (a_s+…+a_t) (as​+…+at​),在基于线段树的实…

【ChatGLM3-6B】Docker下部署及微调

【ChatGLM2-6B】小白入门及Docker下部署 注意&#xff1a;Docker基于镜像中网盘上上传的有已经做好的镜像&#xff0c;想要便捷使用的可以直接从Docker基于镜像安装看Docker从0安装前提下载启动访问 Docker基于镜像安装容器打包操作&#xff08;生成镜像时使用的命令&#xff0…

Nginx常用负载均衡策略

Nginx常用负载均衡策略 轮询&#xff08;默认&#xff09; 注意&#xff1a;这里的轮询并不是每个请求轮流分配到不同的后端服务器&#xff0c;与ip_hash类似&#xff0c;但是按照访问url的hash结果来分配请求&#xff0c;使得每个url定向到同一个后端服务器&#xff0c;主要…

什么手机30万?VERTU唐卡手机顶配56.8万

近日,一则新闻在社交媒体上引发了广泛关注。一名男子遗失了一部价值30万的VERTU唐卡定制款手机,而一位女士在捡到这部手机后,误以为是一部普通的老年机,引发了种种误会。30万的手机是什么牌子?VERTU唐卡手机浮出水面 据了解,这部VERTU唐卡定制款手机是一款豪华的奢侈品定制手机…

2-Python与设计模式--前言

0-Python与设计模式–前言 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验&#xff0c; 考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言&#xff0c; 它是一种解决问题的思…

GoogleNet详解

一、亮点 AlexNet、VGG都只有一个输出层。googlenet有三个&#xff08;其中两个是辅助分类层&#xff09; 二、先看看Inception结构 1、Inception 之前的网络&#xff1a; AlexNet、VGG都是串行结构 Inception&#xff1a; 并行结构 上一层的输出同时传入四个并行结构&…