HttpClientTemplate JDK11以上的版本,可以用,我写的。
package com.diandaxia.common.template; import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.Charset;
import java.util.Map; /**
* Spring的restTemplate不好用 by liyuxin
* 自己封装一个使用,以下是restTemplate的发送post请求的用法。必须得用这个MultiValueMap 否则controller 层接收不到参数。
* 解决方法1:在controller 那里增加@RequestBody 注解,但是这么做就污染了此controller 只能接收 restTemplate的提交.
* 解决方法2:在url上像get请求一样拼接占位符,然后把参数的值放在第四个变量上。这种做法也不好。。
* MultiValueMap<String, Object> postMap = new LinkedMultiValueMap<String, Object>();
* postMap.add("code", code);
* postMap.add("state", state);
* ResponseUtil responseUtil = restTemplateBuilder.build().postForObject(oauthUrl, postMap, ResponseUtil.class);
* if (!responseUtil.getFlag()){
* oauthResultBean.setFlag(false);
* oauthResultBean.setMsg(responseUtil.getMsg());
* return oauthResultBean;
* }
* ----------------------------------------
* 决定自己写个简单的,方便自己使用,内部用到了ObjectMapper,尽量不要static了,所以交给Spring来管理内存吧
*/
@Component
public class HttpClientTemplate { @Autowired
ObjectMapper objectMapper; /**
* 发送GET请求,响应是数据,默认用UTF-8编码来读取
*/
public String httpGet(String getUrl, Map<String, String> paramsMap) throws IOException, InterruptedException { /**
* 1.判断是否有入参,有的话从Map中取值拼接,注意需要UrlEncode
*/
String paramsStr = null;
StringBuilder stringBuilder = new StringBuilder();
if (paramsMap != null){
for (String key : paramsMap.keySet()){
stringBuilder.append(key).append("=").append(URLEncoder.encode(paramsMap.get(key), Charset.forName("UTF-8"))).append("&");
}
paramsStr = stringBuilder.deleteCharAt(stringBuilder.length()-1).toString();
}
if(paramsStr != null){
getUrl = getUrl.concat("?").concat(paramsStr);
} /**
* 2.开始get请求,返回的结果用UTF-8编码读取
*/
HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create(getUrl)).GET().build();
HttpResponse<String> httpResponse = HttpClient.newBuilder().build().send(httpRequest, HttpResponse.BodyHandlers.ofString(Charset.forName("UTF-8")));
return httpResponse.body();
} /**
* 发送Post请求
* 设置 Content-Type 为:application/x-www-form-urlencoded(经过测试必须设置,那就设置把)
* 1.POST请求的两种编码格式:application/x-www-urlencoded是浏览器默认的编码格式,用于键值对参数,参数之间用&间隔;
* 2.multipart/form-data常用于文件等二进制,也可用于键值对参数,最后连接成一串字符传输(Java OK HTTP)。除了这两个编码格式,还有application/json也经常使用。
*/
public String httpPostByForm(String postUrl, Map<String, String> paramsMap) throws IOException, InterruptedException { /**
* 1.拼接参数与get请求一样
*/
String paramsStr = null;
StringBuilder stringBuilder = new StringBuilder();
if (paramsMap != null){
for (String key : paramsMap.keySet()){
stringBuilder.append(key).append("=").append(URLEncoder.encode(paramsMap.get(key), Charset.forName("UTF-8"))).append("&");
}
paramsStr = stringBuilder.deleteCharAt(stringBuilder.length()-1).toString();
} /**
* 2.开始提交post请求
*/
HttpRequest httpRequest = null;
if(paramsStr != null){
httpRequest = HttpRequest.newBuilder().uri(URI.create(postUrl)).setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8").POST(HttpRequest.BodyPublishers.ofString(paramsStr, Charset.forName("UTF-8"))).build();
}else {
httpRequest = HttpRequest.newBuilder().uri(URI.create(postUrl)).POST(HttpRequest.BodyPublishers.noBody()).build();
}
HttpResponse<String> httpResponse = HttpClient.newBuilder().build().send(httpRequest, HttpResponse.BodyHandlers.ofString(Charset.forName("UTF-8")));
return httpResponse.body();
} /**
* 有些服务端规定, Content-Type 必须为:Content-Type:application/json
* 如拼多多的授权获取token那里必须post提交,且Header 必须设置:Content-Type:application/json
* 请求报文内容必须为JSON格式报文包
*/
public String httpPostByJson(String postUrl, Map<String, String> paramsMap) throws IOException, InterruptedException { /**
* 1.转换成json报文
*/
String paramsJson = null;
if (paramsMap.size() != 0){
paramsJson = objectMapper.writeValueAsString(paramsMap);
} /**
* 2.开始提交post请求
*/
HttpRequest httpRequest = null;
if(paramsJson != null){
httpRequest = HttpRequest.newBuilder().uri(URI.create(postUrl)).setHeader("Content-Type", "application/json;charset=UTF-8").POST(HttpRequest.BodyPublishers.ofString(paramsJson, Charset.forName("UTF-8"))).build();
}else {
httpRequest = HttpRequest.newBuilder().uri(URI.create(postUrl)).POST(HttpRequest.BodyPublishers.noBody()).build();
}
HttpResponse<String> httpResponse = HttpClient.newBuilder().build().send(httpRequest, HttpResponse.BodyHandlers.ofString(Charset.forName("UTF-8")));
return httpResponse.body();
} }
HttpClientTemplate JDK11以上的版本,可以用,我写的。的更多相关文章
- JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)
这篇文章我们来探讨一下关于JDK.Eclipse.Myeclipse.Tomcat的版本问题.一.关于版本的几个概念1.32位和64位两个版本: 简言之,64位的操作系统支持识别4G以上的内存条 ...
- Error:java:错误:不支持发行版本 5(或写着其他版本的~)
很多人会出现:Error:java:错误:不支持发行版本 5(或13等版本),均是因为此几个地方版本不一致 [若你下载的jdk版本真的是5,请你更新jdk !!] (上图打开方式:左上角,Fi ...
- [Jenkins]JDK版本过高导致的java.io.IOException: Remote call on xxxx failed
------------------------------------------------------ 如需转载,请注明出处. 文章链接:https://www.cnblogs.com/dzbl ...
- JDK11 JAVA11下载安装与快速配置环境变量教程
https://blog.csdn.net/weixin_40928253/article/details/83590136 1.到Oracle官网下载jdk11,并安装.搜索“jdk",选 ...
- 如何安装多个jdk并方便切换系统jdk版本
如何安装多个jdk并方便切换系统jdk版本 前言 在安装myeclipse时,压缩包中附带1.8.0的jdk,顺便安装并配置环境变量后发现系统默认的jdk变为了1.8.0.随后发现eclipse只支持 ...
- 安装多个版本的 JDK
安装多个版本的 JDK 刚刚开始学 Java 的时候安装了 JDK9 版本,后续发现还是 JDK8 使用的多些,而又不想删除原先版本 因此安装两个版本的 JDK 在需要是切换一下即可 1. 安装第一个 ...
- k8s部署canal-1.1.6版本实现MySQL数据库数据同步
1.版本说明 软件&镜像 版本&镜像信息 说明 Kubernetes v1.23.7 k8s服务器 Kuboard v3.5.2.0 k8s连接管理工具 Canal v1.1.6 数据 ...
- React Native 开发环境搭建——nodejs安装、yarn安装、JDK安装多个版本、安装Android Studio、配置Android SDK的环境变量
一.React Native介绍 二.开发环境的搭建 2.1.Node.js安装 Node.js要求14版或更新 https://nodejs.org/en 查看版本: 2.2.yarn安装 Yarn ...
- 使用nvm利器,管理node版本
node.js越来越热,应用的场景也越来越多. 但也因为是开源软件,所以具备大多数开源软件都存在的“版本问题”,版本发展很快,版本前后差异性大,老系统用新版本node跑不过,全局安装的第三方组件和no ...
- Android APP 读取 AndroidManifest.xml 中的版本信息详解
APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...
随机推荐
- 基于python+django的电影搜索网站-搜索引擎系统设计与实现
该项目是基于python的web类库django开发的一套web网站,给师弟做的课程设计. 本人的研究方向是一项关于搜索的研究项目.在该项目中,笔者开发了一个简单版的搜索网站,实现了对数据库数据的检索 ...
- LLM面面观之LLM上下文扩展方案
1. 背景 本qiang~这段时间调研了LLM上下文扩展的问题,并且实打实的运行了几个开源的项目,所谓实践与理论相结合嘛! 此文是本qiang~针对上下文扩展问题的总结,包括解决方案的整理概括,文中参 ...
- 【linux】Linux内核结构体--kfifo 环状缓冲区
1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...
- Java - 输出空心菱形
1. 思路:发现菱形的规律 ,定义三个变量,左边距和右边距,中间的边距 . 具体规律观察上图 . 2.上代码: //输出空心菱形 public class ForToLingXing { pub ...
- [转帖]Linux三剑客之sed的初阶使用
https://www.jianshu.com/p/ceea435635a2 大多数情况下,对于文件内容的修改需要依赖交互式的软件来实现,例如vim修改文件的内容则是依赖光标的移动和修改操作来完成对文 ...
- [转帖]【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)
目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数: FIO结果说明 I/O 的重放('录'下实际工况的IO,用fio'重放') fio工作参数可以写入配置文 ...
- [转帖]linux磁盘IO读写性能优化
在LINUX系统中,如果有大量读请求,默认的请求队列或许应付不过来,我们可以 动态调整请求队列数来提高效率,默认的请求队列数存放在/sys/block/xvda/queue/nr_requests 文 ...
- [转帖]浅谈redis采用不同内存分配器tcmalloc和jemalloc
http://www.kaotop.com/it/173669.html 我们知道Redis并没有自己实现内存池,没有在标准的系统内存分配器上再加上自己的东西.所以系统内存分配器的性能及碎片率会对Re ...
- [转帖]020 Linux 20 个宝藏命令案例
https://my.oschina.net/u/3113381/blog/5478108 1 JDK 相关的查找命令 (1)确认是否安装 JDK //命令 java -version //输出示例 ...
- zabbix基于容器化在UOS1050E上面的安装与使用
前言 想着能够监控一下操作系统的日志. 因为国产化的需求, 所以我这边使用了UOS1050E 安装zabbix时多次提示缺少php-json 或者是缺少一些libevent等组件. 自己尝试进行解决发 ...