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 ...
随机推荐
- vue tabBar导航栏设计实现3-进一步抽取tab-item
系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...
- S3C2440移植uboot之编译烧写uboot
目录 移植环境 获取uboot 更新交叉编译工具 配置环境变量 移植环境 主 机:VMWare--ubuntu16.04 开发板:S3C2440 编译器:arm-linux-gcc-4.3.2.tgz ...
- 《3D编程模式》写书-第5次记录
大家好,这段时间我完成了对初稿的第一轮修改,即将开始第二轮的修改 这里是所有的的写书记录: <3D编程模式>写书记录 本轮修改主要进行了下面的修改: 修改错误 修改了UML错误.文字错误. ...
- 介绍几种OPTIONS检测的方法
概述 日常的VOIP开发中,OPTIONS检测是常用的网络状态检测工具. OPTIONS原本是作为获取对方能力的消息,也可以检测当前服务状态.正常情况下,UAS收到OPTIONS心跳,直接回复200即 ...
- zzuli 1902: 985的因子对难题
***这道题明显是在卡时间,类比快速打素数表的算法,*** #include<iostream> #include<cstdio> #include<cstring> ...
- 机器学习-无监督机器学习-密度聚类DBSCAN-19
目录 1. DBSCAN 2. OPTICS 2. MeanShift 1. DBSCAN Density based clustering DBSCAN不要求我们指定cluster簇的数量,避免了异 ...
- [IDEA] [SpringBoot] 项目所写的内容不能同步到编译出的文件中
错误原因: 不小心删除了 .yml 导致了,项目所写的内容不能同步到编译出的文件中,之后项目中的任何修改或添加的内容不能同步到编译出的文件中 解决方法 : 文件项目下运行mvn idea:module ...
- MySQL重建表统计信息
MySQL重建表统计信息 背景 最近一段时间遇到了一些性能问题 发现很多其实都是由于 数据库的索引/统计信息不准确导致的问题. Oracle和SQLServer都遇到了很多类似的问题. 我这边联想到 ...
- K8S增加限制后的启动时间验证
K8S增加限制后的启动时间验证 背景 前段时间看了下JVM载linux上面的启动时间, 进行过一些验证. 最近想着能够验证一下K8S上面的启动相关的信息 所以就整理了一下. 虽然没有特别好的结论, 但 ...
- SQLServer解决deadlock问题的一个场景
SQLServer解决deadlock问题的一个场景 背景 公司产品出现过很多次dead lock 跟研发讨论了很久, 都没有具体的解决思路 但是这边知道了一个SQLServer数据库上面计划100% ...