• Java发送httpPost,httpGet,httpDelete请求


            业务场景:最近开发的项目使用的将文件图片和视频存储在Minio当中,但是准备上线申请资源的时候申请不到资源,就临时决定使用厂商提供的Api接口进行文件图片和视频上传,然后就需要在后端进行登录,文件校验和文件存储和文件检索等http请求的书写,所以下面就分享给大家,如果有不足的地方还请多指教。

    Maven依赖:

    1. <dependency>
    2. <groupId>org.apache.httpcomponentsgroupId>
    3. <artifactId>httpmimeartifactId>
    4. <version>4.5.13version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.httpcomponentsgroupId>
    8. <artifactId>httpclientartifactId>
    9. <version>4.5.13version>
    10. dependency>

    Controller:

            httpPost请求:

    1. @RestController
    2. @Slf4j
    3. @RequestMapping("/backend/v1/upload")
    4. public class UploadDIMSController {
    5. @Autowired
    6. private UploadService uploadService;
    7. @Autowired
    8. private ResourceService resourceService;
    9. @Autowired
    10. private DIMSConfig dimsConfig;
    11. /**
    12. * DIMS文件上传的接口
    13. * 统一使用一个接口
    14. */
    15. @BackendPermissionMiddleware(slug = BPermissionConstant.RESOURCE_CATEGORY)
    16. @PostMapping("/dims-upload")
    17. public JsonResponse uploadDIMSHttp(@RequestParam HashMap params, MultipartFile file)
    18. throws ServiceException {
    19. if (file != null && !file.isEmpty()) {
    20. try {
    21. //1.登录获取token
    22. String token = loginDIMS(dimsConfig.getDimsSysCode(), dimsConfig.getUsername(), dimsConfig.getPassword());
    23. if (token.equals("获取token失败") ) {
    24. return JsonResponse.error("服务器异常,请稍后重试;" + token);
    25. }
    26. //2.获取批次号 和scanTime
    27. HashMap scanTimeAndBatchCode = getBatchCode(dimsConfig.getDimsSysCode(), dimsConfig.getDimsFunCode(), token);
    28. if (scanTimeAndBatchCode == null || scanTimeAndBatchCode.isEmpty()) {
    29. log.info("dims服务器异常,获取批次号失败。");
    30. return JsonResponse.error("服务器异常,请稍后重试");
    31. }
    32. //3.上传文件 获取imageID上传的唯一标识
    33. String imageId = uploadFileAcquireImageId(file);
    34. if (imageId.equals("文件上传失败")) {
    35. log.info("dims服务器异常,文件上传失败。");
    36. return JsonResponse.error("服务器异常,请稍后重试;" + imageId);
    37. }
    38. //4.上传业务信息
    39. List arrayList = new ArrayList<>();
    40. InfosVO infosVO = new InfosVO();
    41. arrayList.add(infosVO);
    42. String code = uploadFileInfo(dimsConfig.getDimsSysCode(), token, dimsConfig.getDimsFunCode(), arrayList);
    43. if (code != "1") {
    44. log.info("dims服务器异常,上传业务信息失败。");
    45. return JsonResponse.error("服务器异常,请稍后重试;");
    46. }
    47. //5.文件检索,将检索的地址直接保存到数据库当中直接返回给前端,前端进行处理
    48. String downloadUrl = fileSearchAndSavaUrlToResource(dimsConfig.getDimsSysCode(), scanTimeAndBatchCode.get("batchCode"), token, dimsConfig.getDimsFunCode());
    49. if (downloadUrl.equals("文件检索失败。") ) {
    50. log.info("dims服务器异常,文件检索失败。");
    51. return JsonResponse.error("服务器异常,请稍后重试;" + downloadUrl);
    52. }
    53. //获取上传到那个分类当中
    54. String categoryIds = MapUtils.getString(params, "category_ids");
    55. //传递管理员id,文件,和分类
    56. Resource resource = uploadService.storeDIMS(BCtx.getId(), file, categoryIds, downloadUrl );
    57. if (resource != null) {
    58. //上传成功应该传递文件的路径
    59. return JsonResponse.data("上传成功。");
    60. } else {
    61. return JsonResponse.error("上传失败。");
    62. }
    63. } catch (IOException e) {
    64. e.printStackTrace();
    65. throw new ServiceException("Error uploading file to DIMS server");
    66. }
    67. } else {
    68. return JsonResponse.error("文件为空。");
    69. }
    70. }
    71. /**
    72. * 1.登录获取token的方法
    73. */
    74. public String loginDIMS(String sysCode, String userName, String password) throws IOException {
    75. // 构建HTTP客户端
    76. CloseableHttpClient httpClient = HttpClients.createDefault();
    77. // 创建 HTTP POST 请求
    78. HttpPost httpPost = new HttpPost(dimsConfig.getLoginUrl());
    79. // 创建要传递的参数列表
    80. List params = new ArrayList<>();
    81. params.add(new BasicNameValuePair("sysCode", sysCode));
    82. params.add(new BasicNameValuePair("user", userName));
    83. params.add(new BasicNameValuePair("pwd", password));
    84. // 将参数设置到请求中
    85. httpPost.setEntity(new UrlEncodedFormEntity(params));
    86. try {
    87. // 执行请求并获取响应
    88. HttpResponse response = httpClient.execute(httpPost);
    89. HttpEntity entity = response.getEntity();
    90. // 处理响应
    91. if (entity != null) {
    92. // 将响应实体转换为字符串,响应的token
    93. String responseText = EntityUtils.toString(entity);
    94. return responseText;
    95. } else {
    96. return "获取token失败";
    97. }
    98. } finally {
    99. // 释放资源
    100. httpPost.releaseConnection();
    101. }
    102. }
    103. /**
    104. * 2.获取批次号
    105. */
    106. public HashMap getBatchCode(String sysCode, String funCode, String token) throws IOException {
    107. HashMap hashMap = new HashMap<>();
    108. ObjectMapper objectMapper = new ObjectMapper();
    109. // 构建HTTP客户端
    110. CloseableHttpClient httpClient = HttpClients.createDefault();
    111. // 创建 HTTP POST 请求
    112. HttpPost httpPost = new HttpPost(dimsConfig.getBatchCodeUrl());
    113. // 创建要传递的参数列表
    114. List params = new ArrayList<>();
    115. params.add(new BasicNameValuePair("sysCode", sysCode));
    116. params.add(new BasicNameValuePair("funCode", funCode));
    117. params.add(new BasicNameValuePair("token", token));
    118. // 将参数设置到请求中
    119. httpPost.setEntity(new UrlEncodedFormEntity(params));
    120. try {
    121. // 执行请求并获取响应
    122. HttpResponse response = httpClient.execute(httpPost);
    123. HttpEntity entity = response.getEntity();
    124. // 处理响应
    125. if (entity != null) {
    126. String responseText = EntityUtils.toString(entity);
    127. log.info("getBatchCode-entity:{}", responseText);
    128. //{"msg":"获取成功","data":"{\"scanTime\":\"2023-09-27 7:40:32\"}}"
    129. // 去除jar包返回的空字符,对接的系统的bug
    130. String sanitizedText = responseText.replace("\0", "");
    131. // String sanitizedText = responseText.trim(); //第二种方式去除空白字符
    132. //{"msg":"获取成功","data":{"scanTime":"2023-09-27 7:40:32","batchCode":"sdsdas211dsdx"}}
    133. // 解析响应字符串
    134. JSONObject entries = new JSONObject(sanitizedText);
    135. hashMap.put("scanTime", entries.getJSONObject("data").getStr("scanTime"));
    136. hashMap.put("batchCode", entries.getJSONObject("data").getStr("batchCode"));
    137. return hashMap;
    138. } else {
    139. return new HashMap<>();
    140. }
    141. } finally {
    142. // 释放资源
    143. httpPost.releaseConnection();
    144. }
    145. }
    146. /**
    147. * 3.上传文件返回imageId
    148. */
    149. public String uploadFileAcquireImageId(MultipartFile file) throws IOException {
    150. // 构建HTTP客户端
    151. CloseableHttpClient httpClient = HttpClients.createDefault();
    152. // 创建HTTP POST请求
    153. HttpPost httpPost = new HttpPost(dimsConfig.getUploadMaxFileUrl());
    154. // 创建一个包含文件和其他参数的多部分实体
    155. /**
    156. * 这是需要对接的这个接口也是用MultipartFile file进行接收的方式
    157. * */
    158. /* MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    159. builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, file.getOriginalFilename());
    160. httpPost.setEntity(builder.build());*/
    161. /**
    162. * 接口接收二进制数据
    163. * */
    164. // 设置请求头,告诉服务器请求体是二进制数据
    165. httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/octet-stream");
    166. // 将文件内容作为二进制数据设置为请求体
    167. byte[] fileBytes = file.getBytes();
    168. HttpEntity entity = new ByteArrayEntity(fileBytes);
    169. httpPost.setEntity(entity);
    170. try {
    171. // 发送HTTP请求
    172. HttpResponse response = httpClient.execute(httpPost);
    173. // 处理响应
    174. int statusCode = response.getStatusLine().getStatusCode();
    175. String responseBody = EntityUtils.toString(response.getEntity());
    176. if (statusCode == 200) {
    177. // 请求成功,根据响应处理结果
    178. //这里可能还是要对responseBody进行空值截取
    179. JSONObject entries = new JSONObject(responseBody);
    180. return entries.getJSONObject("data").getStr("imageId");
    181. } else {
    182. // 请求失败,根据需要处理错误情况
    183. // return new JsonResponse("Upload failed", responseBody);
    184. return "文件上传失败";
    185. }
    186. } finally {
    187. // 释放资源
    188. httpPost.releaseConnection();
    189. }
    190. }
    191. /**
    192. * 4.上传业务信息
    193. */
    194. // uploadFileInfo(dimsConfig.getDimsSysCode(),token,dimsConfig.getDimsFunCode(),arrayList);
    195. public String uploadFileInfo(String sysCode, String token, String funCode, List arrayList) throws IOException {
    196. // 创建 ObjectMapper 对象,用于将对象转换为 JSON 字符串
    197. ObjectMapper objectMapper = new ObjectMapper();
    198. // 将 arrayList 转换为 JSON 字符串
    199. String arrayListJson = objectMapper.writeValueAsString(arrayList);
    200. // 构建HTTP客户端
    201. CloseableHttpClient httpClient = HttpClients.createDefault();
    202. // 创建 HTTP POST 请求
    203. HttpPost httpPost = new HttpPost(dimsConfig.getUploadServiceInfoUrl());
    204. // 创建要传递的参数列表
    205. List params = new ArrayList<>();
    206. params.add(new BasicNameValuePair("sysCode", sysCode));
    207. params.add(new BasicNameValuePair("token", token));
    208. params.add(new BasicNameValuePair("funCode", funCode));
    209. params.add(new BasicNameValuePair("infos", arrayListJson));//转换成JSON字符串
    210. // 将参数设置到请求中
    211. httpPost.setEntity(new UrlEncodedFormEntity(params));
    212. try {
    213. // 执行请求并获取响应
    214. HttpResponse response = httpClient.execute(httpPost);
    215. // 处理响应
    216. String responseBody = EntityUtils.toString(response.getEntity());
    217. // 请求成功,根据响应处理结果
    218. //这里可能还是要对responseBody进行空值截取
    219. JSONObject entries = new JSONObject(responseBody);
    220. return entries.getStr("code");
    221. } finally {
    222. // 释放资源
    223. httpPost.releaseConnection();
    224. }
    225. }
    226. /**
    227. * 5.文件检索,获取 downloadUrl 进行拼接进行下载
    228. */
    229. // fileSearchAndSavaUrlToResource(dimsConfig.getDimsSysCode(),scanTimeAndBatchCode.get("batchCode"),token,dimsConfig.getDimsFunCode());
    230. public String fileSearchAndSavaUrlToResource(String sysCode, String batchCode, String token, String funCOde) throws IOException {
    231. // 构建HTTP客户端
    232. CloseableHttpClient httpClient = HttpClients.createDefault();
    233. // 创建 HTTP POST 请求
    234. HttpPost httpPost = new HttpPost(dimsConfig.getFileSearchUrl());
    235. // 创建要传递的参数列表
    236. List params = new ArrayList<>();
    237. params.add(new BasicNameValuePair("sysCode", sysCode));
    238. params.add(new BasicNameValuePair("batchCode", batchCode));
    239. params.add(new BasicNameValuePair("token", token));
    240. params.add(new BasicNameValuePair("funCode", funCOde));
    241. // 将参数设置到请求中
    242. httpPost.setEntity(new UrlEncodedFormEntity(params));
    243. try {
    244. // 执行请求并获取响应
    245. HttpResponse response = httpClient.execute(httpPost);
    246. HttpEntity entity = response.getEntity();
    247. log.info("fileSearchAndSavaUrlToResource-entity:{}", entity);
    248. // 处理响应
    249. if (entity != null) {
    250. // 将响应实体转换为字符串
    251. String responseText = EntityUtils.toString(entity);
    252. JSONObject entries = new JSONObject(responseText);
    253. if (entries.getStr("code") == "1") {
    254. JSONArray dataArray = entries.getJSONArray("data");
    255. JSONObject firstElement = dataArray.getJSONObject(0);
    256. // 这里的 firstElement 就是第一个元素
    257. return firstElement.getStr("downloadUrl");//获取 downloadUrl
    258. } else {
    259. return "文件检索失败。";
    260. }
    261. } else {
    262. return "文件检索失败。";
    263. }
    264. } finally {
    265. // 释放资源
    266. httpPost.releaseConnection();
    267. }
    268. }
    269. /**
    270. * 获取上传文件的md5
    271. *
    272. * @param file
    273. * @return
    274. * @throws IOException
    275. */
    276. public String getMd5(MultipartFile file) {
    277. try {
    278. //获取文件的byte信息
    279. byte[] uploadBytes = file.getBytes();
    280. // 拿到一个MD5转换器
    281. MessageDigest md5 = MessageDigest.getInstance("MD5");
    282. byte[] digest = md5.digest(uploadBytes);
    283. //转换为16进制
    284. String md5Hex = new BigInteger(1, digest).toString(16);
    285. // 确保MD5值始终是32位
    286. while (md5Hex.length() < 32) {
    287. md5Hex = "0" + md5Hex;
    288. }
    289. return md5Hex;
    290. } catch (Exception e) {
    291. log.error(e.getMessage());
    292. }
    293. return null;
    294. }
    295. }

              httpGet请求:     

    1. public String loginDIMS(String sysCode, String userName, String password) throws IOException {
    2. // 创建HTTP客户端
    3. HttpClient httpClient = HttpClients.createDefault();
    4. // 构建GET请求URL
    5. String getUrl = dimsConfig.getLoginUrl() + "?sysCode=" + sysCode + "&user=" + userName + "&pwd=" + password;
    6. // 创建HTTP GET请求
    7. HttpGet httpGet = new HttpGet(getUrl);
    8. try {
    9. // 执行GET请求并获取响应
    10. HttpResponse response = httpClient.execute(httpGet);
    11. HttpEntity entity = response.getEntity();
    12. // 处理响应
    13. if (entity != null) {
    14. // 将响应实体转换为字符串,响应的token
    15. String responseText = EntityUtils.toString(entity);
    16. return responseText;
    17. } else {
    18. return "获取token失败";
    19. }
    20. } finally {
    21. // 释放资源
    22. httpGet.releaseConnection();
    23. }
    24. }

            httpPut请求:

    1. public JsonResponse httpPutMethod(@RequestParam HashMap params, MultipartFile file) throws IOException {
    2. // 创建HTTP客户端
    3. CloseableHttpClient httpClient = HttpClients.createDefault();
    4. // 构建PUT请求URL
    5. String putUrl = "http://127.0.0.1:8080/test"; // 替换为实际的上传URL
    6. // 创建HTTP PUT请求
    7. HttpPut httpPut = new HttpPut(putUrl);
    8. try {
    9. // 创建请求体,使用MultipartEntityBuilder来构建
    10. MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    11. entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    12. //将file和parms参数放在请求体中
    13. entityBuilder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, file.getOriginalFilename());
    14. entityBuilder.addTextBody("params", new Gson().toJson(params), ContentType.APPLICATION_JSON);
    15. // 设置请求实体
    16. HttpEntity reqEntity = entityBuilder.build();
    17. httpPut.setEntity(reqEntity);
    18. // 执行PUT请求并获取响应
    19. HttpResponse response = httpClient.execute(httpPut);
    20. HttpEntity responseEntity = response.getEntity();
    21. log.info("response:{}", response);
    22. log.info("responseEntity:{}", responseEntity);
    23. // 处理响应
    24. if (responseEntity != null) {
    25. // 将响应实体转换为字符串
    26. String responseText = EntityUtils.toString(responseEntity);
    27. log.info("responseText:{}", responseText);
    28. if (responseText != null) {
    29. return JsonResponse.data(responseText);
    30. }
    31. return JsonResponse.error("处理失败");
    32. } else {
    33. return JsonResponse.error("上传和处理失败");
    34. }
    35. } finally {
    36. // 释放资源
    37. httpPut.releaseConnection();
    38. }
    39. }

            httpDelete请求:

    1. public String deleteDIMS(String resourceUrl) throws IOException {
    2. // 创建HTTP客户端
    3. HttpClient httpClient = HttpClients.createDefault();
    4. // 构建DELETE请求
    5. HttpDelete httpDelete = new HttpDelete(resourceUrl);
    6. try {
    7. // 执行DELETE请求并获取响应
    8. HttpResponse response = httpClient.execute(httpDelete);
    9. int statusCode = response.getStatusLine().getStatusCode();
    10. // 处理响应
    11. if (statusCode == 200) {
    12. // 处理成功的响应,根据需要返回结果
    13. return "删除成功";
    14. } else {
    15. // 处理失败的响应,根据需要返回错误信息
    16. return "删除失败,状态码:" + statusCode;
    17. }
    18. } finally {
    19. // 释放资源
    20. httpDelete.releaseConnection();
    21. }
    22. }

    还有一个小知识:就是在对接厂商提供的接口的时候获取返回的JSON数据发现数据格式为

    {"msg":"获取成功","data":"{\"scanTime\":\"2023-09-27 7:40:32\"}}"

    其实就是JSON格式,但是就是识别不出来,最后发现这段数据中{”msg“前面有一个空字符,特别神奇,也不知道他们响应是如何响应的,然后我通过

    String sanitizedText = responseText.replace("\0", "");
    

    这个方法把这个小问题给解决了,也可以使用

    String sanitizedText = responseText.trim(); //第二种方式去除空白字符

    进行解决。

  • 相关阅读:
    Vue中图片上传组件封装-antd的a-upload二次封装-案例
    不规则形状的图例制作
    vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代
    Util应用框架 7.x 来了
    Node.js 入门教程 3 如何安装 Node.js
    艾美捷Immunochemistry MitoPT JC-1试剂盒
    解决 urllib2 中 CookiesMiddleware 的 cookie 问题
    AppScan介绍和安装
    vim的基本操作
    [docker]笔记-网络故障处理
  • 原文地址:https://blog.csdn.net/m0_64210833/article/details/133387364