HttpUtil的get和post请求

Http工具类 

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;/*** http 工具类*/
public class HttpUtil {private static String contentType = "application/json";private static String encoding = "UTF-8";/*** post请求* @param url* @param params* @return*/public static String post(String url, String params){try {return postGeneralUrl(url, params);} catch (Exception e) {e.printStackTrace();}return "请求失败";}public static String postGeneralUrl(String generalUrl, String params)throws Exception {URL url = new URL(generalUrl);// 打开和URL之间的连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");// 设置通用的请求属性connection.setRequestProperty("Content-Type", contentType);connection.setRequestProperty("Connection", "Keep-Alive");connection.setUseCaches(false);connection.setDoOutput(true);connection.setConnectTimeout(2000);connection.setDoInput(true);// 得到请求的输出流对象DataOutputStream out = new DataOutputStream(connection.getOutputStream());out.write(params.getBytes(encoding));out.flush();out.close();// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> headers = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : headers.keySet()) {System.err.println(key + "--->" + headers.get(key));}// 定义 BufferedReader输入流来读取URL的响应BufferedReader in = null;in = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));String result = "";String getLine;while ((getLine = in.readLine()) != null) {result += getLine;}in.close();System.err.println("result:" + result);return result;}public static String uploadFile(String url, File file, Map<String, Object> map) {CloseableHttpClient httpClient = HttpClients.createDefault();String result = "";//每个post参数之间的分隔。随意设定,只要不会和其他的字符串重复即可。String boundary ="--------------4585696313564699";try {//文件名String fileName = file.getName();HttpPost httpPost = new HttpPost(url);//设置请求头httpPost.setHeader("Content-Type","multipart/form-data; boundary="+boundary);//HttpEntity builderMultipartEntityBuilder builder = MultipartEntityBuilder.create();//字符编码builder.setCharset(Charset.forName("UTF-8"));//模拟浏览器builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//boundarybuilder.setBoundary(boundary);//multipart/form-databuilder.addPart("file",new FileBody(file));builder.addTextBody("needVerify",map.get("needVerify").toString());builder.addTextBody("businessTimestamp",map.get("businessTimestamp").toString());builder.addTextBody("nonce",map.get("nonce").toString());builder.addTextBody("businessSign",map.get("businessSign").toString());//HttpEntityHttpEntity entity = builder.build();httpPost.setEntity(entity);// 执行提交HttpResponse response = httpClient.execute(httpPost);//响应HttpEntity responseEntity = response.getEntity();if (responseEntity != null) {// 将响应内容转换为字符串result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}public static String get(TreeMap<String, Object> map, String url){//1、创建httpClientCloseableHttpClient client = HttpClients.createDefault();//2、封装请求参数List<BasicNameValuePair> list = new ArrayList<>();map.forEach((k,v)->list.add(new BasicNameValuePair(k, v.toString())));//3、转化参数String params ;String result = null;CloseableHttpResponse response = null;try {params = EntityUtils.toString(new UrlEncodedFormEntity(list, Consts.UTF_8));//4、创建HttpGet请求HttpGet httpGet = new HttpGet(url+ "?"+ params);System.out.println("请求URL: "+httpGet);response = client.execute(httpGet);//5、获取实体HttpEntity entity = response.getEntity();//将实体装成字符串result = EntityUtils.toString(entity);} catch (IOException e) {e.printStackTrace();}finally {try {response.close();} catch (IOException e) {e.printStackTrace();}}return result;}

对象转换为json字符串

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;import java.lang.reflect.Type;/*** Json工具类.*/
public class GsonUtils {private static Gson gson = new GsonBuilder().create();public static String toJson(Object value) {return gson.toJson(value);}public static <T> T fromJson(String json, Class<T> classOfT) throws JsonParseException {return gson.fromJson(json, classOfT);}public static <T> T fromJson(String json, Type typeOfT) throws JsonParseException {return (T) gson.fromJson(json, typeOfT);}

post请求

public static void main(String[] args) {User user= new User();user.setName("张三");// 1.转化参数String param = GsonUtils.toJson(user);// 2.发送请求String url = "";String result = HttpUtil.post(url, param);// 3.获取结果System.out.println("响应结果: "+ result);}

get请求

 public static void main(String[] args) {// 1.组装参数TreeMap<String, Object> map = new TreeMap<>();map.put("name", "张三");map.put("id", "1");map.put("idCard", "51090102198801025878");// 2.签名 无签名可以忽略// String businessSign = SignUtil.sign(map, key);map.put("businessSign", "签名字符串");// 3.发送请求String url = "";String result = HttpUtil.get(map, url);// 4.获取结果System.out.println("响应结果: "+ result);}

如果需要签名

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;public class MD5Encoder {private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b","c", "d", "e", "f"};public static String encode(String rawPass, String salt) {String result = null;try {MessageDigest md = MessageDigest.getInstance("md5");// 加密后的字符串result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass, salt).getBytes(StandardCharsets.UTF_8)));} catch (Exception ex) {}return result;}private static String mergePasswordAndSalt(String password, String salt) {if (password == null) {password = "";}if ((salt == null) || "".equals(salt)) {return password;} else {return password + salt;}}/*** 转换字节数组为16进制字串** @param b 字节数组* @return 16进制字串*/private static String byteArrayToHexString(byte[] b) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++) {resultSb.append(byteToHexString(b[i]));}return resultSb.toString();}private static String byteToHexString(byte b) {int n = b;if (n < 0) {n = 256 + n;}int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.thinkgem.jeesite.modules.panelmachine.request.OpenAPIRequest;
import org.springframework.util.StringUtils;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;public class SignUtil {public static String signJsonObject(JsonObject jsonObject, String signKey, int floor) {List<String> keys = new ArrayList<>();HashMap<String, String> params = new HashMap<>();for (Map.Entry<String, JsonElement> entity : jsonObject.entrySet()) {String key = entity.getKey();String value = "";if (entity.getValue().isJsonNull()) {continue;}if (entity.getValue().isJsonObject()) {value = signJsonObject(entity.getValue().getAsJsonObject(), signKey, floor + 1);} else if (entity.getValue().isJsonArray()) {List<String> result = new ArrayList<>();entity.getValue().getAsJsonArray().forEach(action -> {if (action.isJsonObject()) {result.add(signJsonObject(action.getAsJsonObject(), signKey, floor + 1));} else if (action.isJsonArray()) {result.add(signJsonObject(action.getAsJsonArray().getAsJsonObject(), signKey, floor + 1));} else {result.add(action.getAsString());}});if (result.size() > 0) {Collections.sort(result);StringBuilder sb = new StringBuilder();result.forEach(action -> {if(StringUtils.hasText(action)) {sb.append(action + "&") ;} ;});sb.deleteCharAt(sb.length() - 1);value = MD5Encoder.encode(sb.toString(), "");}} else {value = entity.getValue().getAsString();}if (StringUtils.isEmpty(value)) {} else {keys.add(key);params.put(key, value);}}if (keys.size() == 0) {return "";}// checkSignCollections.sort(keys);StringBuilder sb = new StringBuilder();keys.forEach(key -> sb.append(key + "=" + params.get(key) + "&"));if (floor == 1 && StringUtils.hasText(signKey)) {sb.append("key=" + signKey);} else {sb.deleteCharAt(sb.length() - 1);}System.out.println("签名前字符串:"+ sb.toString());System.out.println("签名结果:"+MD5Encoder.encode(sb.toString(), ""));return MD5Encoder.encode(sb.toString(), "");}public static OpenAPIRequest sign(OpenAPIRequest openAPIRequest, String key) {openAPIRequest.setNonce(UUID.randomUUID().toString());openAPIRequest.setBusinessTimestamp(System.currentTimeMillis()+"");openAPIRequest.setBusinessSign(md5Sign(openAPIRequest,key));return openAPIRequest ;}public static OpenAPIRequest sign(OpenAPIRequest openAPIRequest, Map<String, String> params, String key) {openAPIRequest.setNonce(UUID.randomUUID().toString());openAPIRequest.setBusinessTimestamp(System.currentTimeMillis()+"");openAPIRequest.setBusinessSign(md5Sign(openAPIRequest , params, key));return openAPIRequest ;}public static  String md5Sign(OpenAPIRequest request, Map<String, String> params, String key) {JsonObject jsonObject = new JsonParser().parse(new Gson().toJson(request)).getAsJsonObject();params.entrySet().forEach(action -> jsonObject.addProperty(action.getKey() , action.getValue()));return signJsonObject(jsonObject, key,1) ;}private static String md5Sign(OpenAPIRequest request, String key) {JsonObject jsonObject = new JsonParser().parse(new Gson().toJson(request)).getAsJsonObject();jsonObject.remove("image");return signJsonObject(jsonObject, key ,1) ;}public static String sign(TreeMap<String, Object> map, String key) {StringBuilder sb = new StringBuilder();map.forEach((k,v)->{sb.append(k + "=" + v + "&");});sb.append("key=" + key);System.out.println("签名前字符串: "+ sb);String businessSign = MD5Encoder.encode(sb.toString(), "");System.out.println("签名结果: " + businessSign);return businessSign;}

签名调用方式

//可以更改为配置或者写死 
public static final String KEY = "key"; public static void main(String[] args) {
//封装参数
TreeMap<String, Object> map = new TreeMap<>();map.put("name", "张三");map.put("id", "1");map.put("idCard", "51090102198801025878");
// 签名String businessSign = SignUtil.sign(map, key);}

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

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

相关文章

《C++:计算机视觉图像识别与目标检测算法优化的利器》

在当今科技飞速发展的时代&#xff0c;计算机视觉领域正经历着前所未有的变革与突破。图像识别和目标检测作为其中的核心技术&#xff0c;广泛应用于安防监控、自动驾驶、智能医疗等众多领域&#xff0c;其重要性不言而喻。而 C语言&#xff0c;凭借其卓越的性能、高效的资源控…

NocoBase搭建(下):安装NocoBase

系统和Docker安装好后&#xff0c;开始安装NocoBase。一.创建文件夹NocoBase rootNocobase:/mkdir NocoBase && cd NocoBase二.创建 docker-compose.yml rootNocobase:/vi docker-compose.yml version: "3" networks: nocobase: driver: bridge serv…

实践项目3:温度采集系统

一、功能说明 基于AVR单片机设计一温度采集系统。该系统由一个主机和一个从机构成&#xff0c;能够实时检测并显示现场温度&#xff0c;当温度超过预置温度时&#xff0c;进行声光报警。 二、具体要求 1、主机与从机之间采用串口通信&#xff1b; 2、从机采集温度并通过串口…

React简单入门 - [Next.js项目] - 页面跳转、AntD组件、二级目录等

须知 1Next.js 官网(英文)https://nextjs.org/2Next.js 文档(中文)https://nextjscn.org/docs/3Ant Design组件总览https://ant-design.antgroup.com/components/overview-cn4tailwindcss类名大全 官网https://www.tailwindcss.cn/docs/justify-content 5tailwindcss常用类…

Java中的“泛型“

泛型&#xff08;Generics&#xff09;是Java中的一种重要特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff08;type parameters&#xff09;。泛型的主要目的是提高代码的类型安全性和重用性。下面我将详细讲解Java中的泛型。 1. 泛型的基本概念 泛型允许我…

Python知识分享第25天-快速排序算法

快速排序算法 快速排序&#xff08;QuickSort&#xff09;是一种基于分治法的高效排序算法。它通过选择一个“基准”元素&#xff0c;将数组分成两个子数组&#xff0c;其中一个子数组的所有元素都比基准小&#xff0c;另一个子数组的所有元素都比基准大&#xff0c;然后递归地…

PyTorch练习——张量的四则运算与矩阵运算

练习1&#xff1a; # 导入Torch库 import torch# 创建两个张量 x torch.tensor([1, 2, 3]) y torch.tensor([4, 5, 6])# 执行加法操作 z torch.add(x, y) print("加法结果&#xff1a;", z)# 执行减法操作 z torch.subtract(x, y) print("减法结果&#xf…

String【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…

C# 上位机项目开发实例全解析

一、项目规划与需求分析 功能确定 数据监控&#xff1a; 明确需采集和展示的设备数据种类&#xff0c;如温度、压力数值。规划数据的实时更新频率&#xff0c;保证监控的时效性。控制操作&#xff1a; 列出上位机对下位机的控制功能&#xff0c;如设备的启动与停止。设计控制指…

我们来学mysql -- MSI安装(安装篇)

主题 书接上文&#xff0c;在《探讨win安装方式》中官方推荐MSI要是把大厂的标准奉为圭臬&#xff0c;说啥认啥&#xff0c;他一翻脸&#xff0c;小丑不就是咱了再说了&#xff0c;都干到家门口了8.4版本官方文档&#xff0c;还不给他梭罗下 MSI 点击**.msi弹出MySQL Install…

2024年12月六级写作复习资料

1 如何看待”社交搭子“的现象 1.1 范文 In the rapid pace of modern life, emerging as a novel social model, “da zi socializing” is gaining increasing popularity among young people. It breaks free from the constraints of traditional social interactions, c…

【IC面试问题:UCIE PHY LSM AXI Cache】

IC面试问题&#xff1a;UCIE PHY LSM && AXI && Cache 1 UCIE PHY LSM有几种状态&#xff1f; 以及L1和L2这两种低功耗状态有什么区别&#xff1f;2 AXI的特性&#xff1f; 通道之间有依赖关系吗&#xff1f; master和slave的valid和ready关系&#xff1f; 写数…

C++ 中多态性在实际项目中的应用场景

背景与需求 在一个图形绘制软件中&#xff0c;需要绘制多种不同的图形&#xff0c;如圆形、矩形、三角形等。每个图形都有自己的绘制方法&#xff0c;但是它们都可以被看作是一个抽象的 “图形” 概念&#xff0c;并且都有一个共同的操作&#xff0c;比如绘制&#xff08;draw&…

html|本地实现浏览器m3u8播放器,告别网络视频卡顿

前言 网络上经常是以m3u8文件传输视频流的 &#xff0c;但是有时网络慢往往导致视频播放卡顿。于是我在想能不能先下载然后再播放呢&#xff1f;于是尝试下载然后实现本地播放m3u8视频。 正文 1.找到网络视频流的m3u8连接 一般在浏览器按F12就可以看到有请求视频流的连接。 …

交互开发---测量工具(适用VTK或OpenGL开发的应用程序)

简介&#xff1a; 经常使用RadiAnt DICOM Viewer来查看DICOM数据&#xff0c;该软件中的测量工具比较好用&#xff0c;就想着仿照其交互方式自己实现下。后采用VTK开发应用程序时&#xff0c;经常需要开发各种各样的测量工具&#xff0c;如果沿用VTK的widgets的思路&#xff0c…

VirtIO实现原理之数据结构与数据传输演示(4)

接前一篇文章:VirtIO实现原理之数据结构与数据传输演示(3) 本文内容参考: VirtIO实现原理——vring数据结构-CSDN博客 VirtIO实现原理——数据传输演示-CSDN博客 特此致谢! 一、数据结构总览 2. 相关数据结构 前文书介绍了《Virtual I/O Device (VIRTIO) Version 1.3…

【蓝桥杯每日一题】技能升级

技能升级 2024-12-10 蓝桥杯每日一题 技能升级 二分 题目大意 一个角色有 N 种可以增加攻击力的技能&#xff0c;对于第 i 个技能首次升级可以提升 A i A_i Ai​ 点攻击力&#xff0c;随后的每次升级增加的攻击力都会减少 B i B_i Bi​ 。升级 ⌈ A i B i ⌉ \lceil \frac{A…

uniapp -- 实现页面滚动触底加载数据

效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</

角色动起来

GitHub - LordLiang/DrawingSpinUp: (SIGGRAPH Asia 2024) This is the official PyTorch implementation of SIGGRAPH Asia 2024 paper: DrawingSpinUp: 3D Animation from Single Character Drawings

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用&#xff1f;修改它有什么影响&#xff1f;如何设置该参数&#xff0c;本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…