java发起http、https请求,并携带cookie、header,post参数放body并可选关闭ssl证书验证,高可用版

公司有个需求是发起https请求对接国家数据接口,需要带header、cookie,并关闭ssl证书验证,搜了很多文章,都说用HttpsURLConnection发起请求,但不知为啥在封装body参数的时候一直报400封装出错,也欢迎指出不足。遂找了这古代的方法,方法虽老但能解决实际问题且不用导包。

HttpsURLConnection报错方法示例:

			// 发起HTTPS POST请求URL url = new URL("https://example.com/api/resource");connection = (HttpsURLConnection) url.openConnection();// 设置请求方法为POSTconnection.setRequestMethod("POST");connection.setDoOutput(true); // 允许写入请求体connection.setRequestProperty("Content-Type", "application/json");// 封装请求体参数,这里假设参数是一个 JSON 对象String requestBody = "{\"param1\":\"value1\", \"param2\":\"value2\"}";//此处封装body参数一直报错try (OutputStream os = connection.getOutputStream()) {byte[] input = requestBody.getBytes("utf-8");os.write(input, 0, input.length);}// 获取响应int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}reader.close();System.out.println("Response: " + response.toString());

使用方法(其实cookie也是在header里面):

1.创建默认证书(可选)

    /*** 创建默认证书** @return*/public static CloseableHttpClient createSSLClientDefault() {try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {// 信任所有public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {return true;}}).build();HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);return HttpClients.custom().setSSLSocketFactory(sslsf).build();} catch (Exception e) {e.printStackTrace();}return HttpClients.createDefault();}

2.post请求:

   public static String dopost(String reqUrl, String json, Map<String, String> headerMap) {String strResult = "";CloseableHttpResponse response = null;CloseableHttpClient httpClient = null;if (reqUrl.startsWith("https")) {//可选httpClient = createSSLClientDefault();} else {httpClient = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setSocketTimeout(1 * 60 * 1000).setConnectTimeout(1000).setConnectionRequestTimeout(1000).build()).build();}HttpEntity httpEntity = null;try {HttpPost httpPost = new HttpPost(reqUrl);if (headerMap != null) {headerMap.forEach((k, v) -> httpPost.addHeader(k, v));}StringEntity entity = new StringEntity(json, "UTF-8");//解决中文乱码问题entity.setContentType("application/json");httpPost.setEntity(entity);response = httpClient.execute(httpPost, HttpClientContext.create());int status = response.getStatusLine().getStatusCode();httpEntity = response.getEntity();if (status == 200) {String string = EntityUtils.toString(httpEntity, StandardCharsets.UTF_8);return EntityUtils.toString(httpEntity, StandardCharsets.UTF_8);} else {log.error(reqUrl + " 请求错误:\r\t" + EntityUtils.toString(httpEntity, StandardCharsets.UTF_8));}return strResult;} catch (IOException e) {e.printStackTrace();} finally {try {if (httpEntity != null) {EntityUtils.consume(httpEntity);}if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}}return strResult;}

3.get请求:

    public static ResultVo sendHttpsRequest(String url, String requestMethod, Stringparam, Map<String, String> headers, String cookieStr) {ResultVo vo = new ResultVo();StringBuilder result = new StringBuilder();try {//屏蔽证书验证SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}}}, new SecureRandom());URL console = new URL(url);HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();// GET/POSTconn.setRequestMethod(requestMethod);
//            conn.setDoOutput(true);conn.setDoInput(true);if ("POST".equals(requestMethod)) {try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) {wr.writeBytes(param);wr.flush();}conn.setRequestProperty("Content-Type", "application/json");} else {if (null != param) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式outputStream.write(param.getBytes("UTF-8"));outputStream.close();}}if (ObjectUtil.isNotEmpty(headers)) {for (String s : headers.keySet()) {conn.setRequestProperty(s, headers.get(s));}}conn.setRequestProperty("Cookie", cookieStr);// 设置证书忽略相关操作conn.setSSLSocketFactory(sc.getSocketFactory());conn.setHostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String s, SSLSession sslSession) {return true;}});conn.connect();int responseCode = conn.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream is = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String ret = "";//输出响应信息while ((ret = br.readLine()) != null) {if (ret != null && !ret.trim().equals("")) {result.append(new String(ret.getBytes("utf-8"), "utf-8"));}}List<String> cookies = conn.getHeaderFields().get("Set-Cookie");//这里返回了连接的cookie信息if (cookies != null) {for (String cookie : cookies) {if (cookie.contains(SyncInfoConfig.COOKIE_NAME)) {// 找到目标CookieString sidCookie = cookie.split(";\\s*")[0];vo.setCookieInfo(sidCookie);break;}}}conn.disconnect();br.close();}} catch (NoSuchAlgorithmException | KeyManagementException | MalformedURLException e) {e.printStackTrace();} catch (IOException ioException) {ioException.printStackTrace();}if (ObjectUtil.isNotEmpty(result)) {vo.setResultStr(result.toString());}return vo;}

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

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

相关文章

Linux出击之网络环境设置

Linux中如果想要设置静态IP&#xff0c;这就需要我们进行自己去设置。 首先想知道是否有网络&#xff0c;我们就可以查看我们的网卡信息呀&#xff0c;ping 外网地址试试。 比如&#xff0c; ping www.baidu.com ip addr show, 这两个命令都可以让我们对网络有一个了解。 …

【AHK】设置esc为退格键但又可以通过ctrl+esc保留原来esc的退出的功能

该需求为68键本人自用常用习惯。通过奖罚esc设置为backspace键&#xff0c;开始的习惯思维是通过send实现&#xff0c;导致一直陷入死循环&#xff0c;最后经过多次尝试得出以下方案。 还可以用于 键位对调的思路&#xff0c;即直接对调esc和backspace 方案1 esc::backspace ^e…

【DFS】200.岛屿数量

题目 法1&#xff1a;岛屿数量 class Solution {public int numIslands(char[][] grid) {int m grid.length, n grid[0].length;int[][] used new int[m][n];int res 0;for (int i 0; i < m; i) {for (int j 0; j < n; j) {if (grid[i][j] 0 || used[i][j] 1) …

豪腾四海×实在RPA丨最懂财务的数字员工,为企业节省人天2000+

企业数字化转型&#xff0c;财务是一个重要的切入点。随着豪腾四海数字化业务不断展开&#xff0c;新的系统、流程和数据源被不断引入&#xff0c;财务部门面临的是不断暴增的对账、数电票处理、审计等日常工作。 “如此大的工作量&#xff0c;即使是经验丰富的资深财务&#…

设置一个vue文件的全局模板

VsCode在新建一个.vue文件的时候是空白的&#xff0c;需要我们自己输入片段&#xff0c;可这些在每次新建.vue文件都需要自己手敲&#xff0c;所以创建一个模板方便使用 设置vue模板 导入 {"生成 vue 模板": {"prefix": "vue","body"…

浅谈EC防御技术

两种常见的时效校验机制&#xff1a;TTS三重时间戳、EC计数 小菜最近接触的是EC计数&#xff0c;后续有机会的话有也会介绍哦TSS防御 某一层中&#xff0c;通信实体将数据加上EC计数&#xff0c;发送给对等实体&#xff0c;对等实体根据此进行接收信息间隔预期&#xff0c;通过…

柯桥西班牙语里最“好用”的脏话:一些关于cojones的表达

Creo que una de las palabras con ms contextos donde se puede utilizar y que adems pronto es conocida por los estudiantes de espaol es esta que est en el ttulo. 相信标题中的这个单词“cojones”&#xff0c;使用时总是包含很多含义&#xff0c;同时也是西语学习者最…

Power BI - 5分钟学习增加索引列

每天5分钟&#xff0c;今天介绍Power BI增加索引列。 什么是增加索引列&#xff1f; 增加索引列就是向表中添加一个具有显式位置值的新列&#xff0c;一般从0或者从1开始。 举例&#xff1a; 首先&#xff0c;导入一张【Sales】样例表(Excel数据源导入请参考每天5分钟第一天)…

SuperMap iManager 11i(2023) SP1新特性汇总

作者&#xff1a;ls 【目录】 &#xff08;一&#xff09;GIS云套件支持发布聚合服务&#xff08;二&#xff09;GIS云套件支持自定义/修改服务接口信息&#xff08;三&#xff09;GIS云套件管理界面支持批量修改镜像&#xff08;四&#xff09;GIS云套件管理界面可调整服务节点…

浏览器同时渲染多个高频率更新图表问题分析及解决方案

需求点&#xff1a;一个页面同时渲染十余个刷新频率为100ms的图表 问题分析 首先&#xff0c;我们知道根据浏览器运行原理&#xff08;不知道可以参考-浏览器运行原理&#xff09;&#xff0c;渲染进程是无法实现如此多图表同时高频率渲染的。造成的后果就是&#xff0c;1. 后…

【ChatGLM3】第三代大语言模型多GPU部署指南

关于ChatGLM3 ChatGLM3是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。在第二代ChatGLM的基础之上&#xff0c; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、…

vue 数据更新了,但在页面上没有展示出来

这是因为有时候 vue 无法监听到数据的变化&#xff0c;导致数据变化但是视图没有变化&#xff0c;也就是数据更新了&#xff0c;但在页面上没有显示出来。 方法一&#xff1a;使用 this.$set() 进行数据更新 this.$set(target, key, value); target&#xff1a;要更改的数据源…

三年没回家过年,你的羽绒服准备好了吗?

2023进入尾声&#xff0c;这一年&#xff0c;我们在“阳康”之后重新出发&#xff0c;找回了烟火气&#xff0c;和错过几年的山水重逢&#xff0c;向往远方的同时也更爱眼前的点滴&#xff0c;逐渐重建起对美好生活的期待。 把生活态度投射到社媒上&#xff0c;出圈的热点话题…

基于Spring、SpringMVC、MyBatis的酒店管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring、SpringMVC、MyBatis的酒店管…

riscv64-linux-gnu-gcc编译生成32位cpu二进制

x86平台下64位设备&#xff0c;默认情况下编译的是elf64&#xff0c;比如简单的helloworld代码如下&#xff0c;使用readelf查看elf头部信息&#xff0c;格式为ELF64。 ➜ cat helloworld.c #include <stdio.h>int main() {printf("hello!!!\n");return 0; }…

三种决策树算法

ID3 ID3算法在特征选择时&#xff0c;使用的指标是信息增益&#xff08;Information Gain&#xff09;&#xff0c;信息增益是基于熵&#xff08;entropy&#xff09;的概念&#xff0c;熵是用来衡量数据集中的不确定性或纯度的一个指标。当熵值高时&#xff0c;数据集的不确定…

Notepad++插件:格式化JSON

一、问题描述 最近有这么一串json字符串&#xff1a; 你想看吗&#xff1f; 是不是觉得密密匝匝滴&#xff0c;很不想看呢&#xff1f; 下面是经过处理的json字符串&#xff1a; 你喜欢哪种格式的json字符串展示呢&#xff1f; 反正我喜欢已经格式化的&#xff0c;也就是第二…

​html.parser --- 简单的 HTML 和 XHTML 解析器​

源代码&#xff1a; Lib/html/parser.py 这个模块定义了一个 HTMLParser 类&#xff0c;为 HTML&#xff08;超文本标记语言&#xff09;和 XHTML 文本文件解析提供基础。 class html.parser.HTMLParser(*, convert_charrefsTrue) 创建一个能解析无效标记的解析器实例。 如果…

金蝶云星空和旺店通·企业奇门单据接口对接

金蝶云星空和旺店通企业奇门单据接口对接 对接源平台:旺店通企业奇门 慧策&#xff08;原旺店通&#xff09;是一家技术驱动型智能零售服务商&#xff0c;基于云计算PaaS、SaaS模式&#xff0c;以一体化智能零售解决方案&#xff0c;帮助零售企业数字化智能化升级&#xff0c;实…

Unity - 插件至 ZXing

Unity 使用 ZXing 生成和扫描二维码 Reference: Unity 使用 ZXing 生成和扫描二维码_unity 生成二维码-CSDN博客