HttpClientTemplate JDK11以上的版本,可以用,我写的。
时间:2020-03-07
本文章向大家介绍HttpClientTemplate JDK11以上的版本,可以用,我写的。,主要包括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请求一样拼接占位符,然后把参数的值放在第四个变量上。这种做法也不好。。 * 具体参见:https://blog.csdn.net/weixin_40461281/article/details/83472648 * 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(); } }
原文地址:https://www.cnblogs.com/del88/p/12433100.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- BAT 批处理命令 - 文件批量复制、克隆功能实例演示
- 【35期】谈谈你对Java线程之间通信方式的理解
- mac 技术篇-修改hosts文件,hosts文件位置
- 一行能装逼的 JavaScript 代码
- python 技术篇-时间戳的获取,记录程序处理时间
- 基于SpringBoot AOP面向切面编程实现Redis分布式锁
- Python+Selenium 技巧篇-svg标签内元素的xpath定位方式
- 小书MybatisPlus第5篇-Active Record模式精讲
- Python 语法问题-module ‘pip._internal‘ has no attribute ‘pep425tags‘. 原因及解决办法,32位、64位查看pip支持万能方法
- 总在说 Spring Boot 内置了 Tomcat 启动,那它的原理你说的清楚吗?
- JavaScript 技巧篇-js增加延迟时间解决单击双击事件冲突,双击事件触发单击事件
- Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
- Python 技术篇-如何打印一段文字,用友云霸气控制台颜文字打印
- Python 技术篇-获取秒级时间戳、毫秒级时间戳
- Python 技术篇-基于随机数的uuid码的生成