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以上的版本,可以用,我写的。的更多相关文章

  1. JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)

    这篇文章我们来探讨一下关于JDK.Eclipse.Myeclipse.Tomcat的版本问题.一.关于版本的几个概念1.32位和64位两个版本:    简言之,64位的操作系统支持识别4G以上的内存条 ...

  2. Error:java:错误:不支持发行版本 5(或写着其他版本的~)

      很多人会出现:Error:java:错误:不支持发行版本 5(或13等版本),均是因为此几个地方版本不一致 [若你下载的jdk版本真的是5,请你更新jdk !!]   (上图打开方式:左上角,Fi ...

  3. [Jenkins]JDK版本过高导致的java.io.IOException: Remote call on xxxx failed

    ------------------------------------------------------ 如需转载,请注明出处. 文章链接:https://www.cnblogs.com/dzbl ...

  4. JDK11 JAVA11下载安装与快速配置环境变量教程

    https://blog.csdn.net/weixin_40928253/article/details/83590136 1.到Oracle官网下载jdk11,并安装.搜索“jdk",选 ...

  5. 如何安装多个jdk并方便切换系统jdk版本

    如何安装多个jdk并方便切换系统jdk版本 前言 在安装myeclipse时,压缩包中附带1.8.0的jdk,顺便安装并配置环境变量后发现系统默认的jdk变为了1.8.0.随后发现eclipse只支持 ...

  6. 安装多个版本的 JDK

    安装多个版本的 JDK 刚刚开始学 Java 的时候安装了 JDK9 版本,后续发现还是 JDK8 使用的多些,而又不想删除原先版本 因此安装两个版本的 JDK 在需要是切换一下即可 1. 安装第一个 ...

  7. k8s部署canal-1.1.6版本实现MySQL数据库数据同步

    1.版本说明 软件&镜像 版本&镜像信息 说明 Kubernetes v1.23.7 k8s服务器 Kuboard v3.5.2.0 k8s连接管理工具 Canal v1.1.6 数据 ...

  8. 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 ...

  9. 使用nvm利器,管理node版本

    node.js越来越热,应用的场景也越来越多. 但也因为是开源软件,所以具备大多数开源软件都存在的“版本问题”,版本发展很快,版本前后差异性大,老系统用新版本node跑不过,全局安装的第三方组件和no ...

  10. Android APP 读取 AndroidManifest.xml 中的版本信息详解

    APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...

随机推荐

  1. vue中class样式与内联样式

    (1):style使用 <div class="score" :style="{ color: colorComputed(item.status) }" ...

  2. freeswitch查看所有通道变量

    概述 freeswitch 是一款好用的开源软交换平台. 实际应用中,我们经常需要对fs中的通道变量操作,包括设置和获取,set & get. 但是,fs中有众多的内部定义通道变量,也有外部传 ...

  3. 基于java+springboot的家教预约网站、家教信息管理系统

    该系统是基于java+springboot开发的家教预约网站.是给师妹开发的实习作品.学习过程中,遇到问题可以在github咨询作者. 演示地址 前台地址: http://jiajiao.gitapp ...

  4. CS2打开可以听到声音,但黑屏问题?

    1.问题 我这里原先是可以启动CS2的,但是后来在CS2中重新调整了分辨率等等,之后由于某种原因又调整了屏幕分辨率,导致后面一进入CS2登录界面,橙色登陆界面就会缩在左上角一小块,并且之后就会陷入黑屏 ...

  5. Vue - 父子级的相互调用

    父级调用子级 父级: <script> this.$refs.child.load(); 或 this.$refs.one.load(); </script> 子级: < ...

  6. idea报错 "cannot access ..."的解决办法

    File -> Invalidate Caches -> Invalidate and Restart

  7. [转帖]PostgreSQL 的性能调优方法

    https://juejin.cn/post/7119489847529570334 浅谈PostgreSQL的性能调校 PostgreSQL的性能调校是指调校数据库以提高性能和快速访问数据:我们可以 ...

  8. [转帖]《Linux性能优化实战》笔记(七)—— CPU瓶颈快速分析及性能优化思路

    相当于是前面篇章的小结 一. CPU 性能指标 常见指标包括: 平均负载 CPU 使用率(user.iowait.system.软硬中断等) 进程上下文切换(自愿.非自愿) CPU 缓存的命中率 CP ...

  9. [转帖]Web性能优化工具WebPageTest(一)——总览与配置

    https://www.cnblogs.com/strick/p/6677836.html 网站性能优化工具大致分为两类:综合类和RUM类(实时监控用户类),WebPageTest属于综合类. Web ...

  10. es6新增的运算符-链判断运算符的诞生[?.]和null的判断运算符??

    指数运算符 ** console.log(2 ** 2 ) //4 console.log(2 ** 3 ) //8 console.log(2 ** 4) //16 链判断运算符的诞生(?.) 在实 ...