JAVA后端封装Https请求

前言

因业务功能需要使用微信小程序发送模板消息,放在前端请求不安全,所以想到了把请求放到了后端来做。

首先封装用到了JSONObject,需要引入jar包如下 (JSONObject有很多,这里引入的阿里的,如果需要,可自行更换):

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.38</version>
        </dependency>

首先需要实现java1.8自带的一个接口:


import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;


public class MyX509TrustManager implements X509TrustManager {
   // 检查客户端证书
   @Override
   public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
   }

   // 检查服务器端证书
   @Override
   public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
   }

   // 返回受信任的X509证书数组
   @Override
   public X509Certificate[] getAcceptedIssuers() {
       return null;
   }

}

然后实现https请求的类:

package com.example.wechatmap.tools;

import com.alibaba.fastjson.JSONObject;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;


public class HttpsRequestTools {
   public static String TOKEN;
   public static Long TOKENTIME = null;
   /**
    * 发送https请求
    *
    * @param requestUrl 请求地址
    * @param requestMethod 请求方式(GET、POST)
    * @param outputStr 提交的数据
    * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
    */
   public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
       JSONObject jsonObject = null;
       try {
           // 创建SSLContext对象,并使用我们指定的信任管理器初始化
           TrustManager[] tm = { new MyX509TrustManager() };
           SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
           sslContext.init(null, tm, new java.security.SecureRandom());
           // 从上述SSLContext对象中得到SSLSocketFactory对象
           SSLSocketFactory ssf = sslContext.getSocketFactory();

           URL url = new URL(requestUrl);
           HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
           conn.setSSLSocketFactory(ssf);

           conn.setDoOutput(true);
           conn.setDoInput(true);
           conn.setUseCaches(false);
           // 设置请求方式(GET/POST)
           conn.setRequestMethod(requestMethod);

           // 当outputStr不为null时向输出流写数据
           if (null != outputStr) {
               OutputStream outputStream = conn.getOutputStream();
               // 注意编码格式
               outputStream.write(outputStr.getBytes("UTF-8"));
               outputStream.close();
           }

           // 从输入流读取返回内容
           InputStream inputStream = conn.getInputStream();
           InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
           BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
           String str = null;
           StringBuffer buffer = new StringBuffer();
           while ((str = bufferedReader.readLine()) != null) {
               buffer.append(str);
           }

           // 释放资源
           bufferedReader.close();
           inputStreamReader.close();
           inputStream.close();
           inputStream = null;
           conn.disconnect();
           jsonObject = JSONObject.parseObject(buffer.toString());
       } catch (ConnectException ce) {
       } catch (Exception e) {
       }
       return jsonObject;
   }

   /**
    * 字节数组转换为十六进制字符串
    *
    * @param b
    *            byte[] 需要转换的字节数组
    * @return String 十六进制字符串
    */
   public static final String byte2hex(byte b[]) {
       if (b == null) {
           throw new IllegalArgumentException(
                   "Argument b ( byte array ) is null! ");
       }
       String hs = "";
       String stmp = "";
       for (int n = 0; n < b.length; n++) {
           stmp = Integer.toHexString(b[n] & 0xff);
           if (stmp.length() == 1) {
               hs = hs + "0" + stmp;
           } else {
               hs = hs + stmp;
           }
       }
       return hs.toUpperCase();
   }
}

以上为具体示例,如果有问题可加qq:1016400304

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个完整的解决方案。 前端代码: ``` <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> export default { methods: { handleFileChange(event) { const file = event.target.files[0]; const formData = new FormData(); formData.append('file', file); // 将formData传给后端 this.uploadImage(formData); }, async uploadImage(formData) { const response = await fetch('http://your-backend-api.com/uploadImage', { method: 'POST', body: formData }); const result = await response.json(); console.log(result); } } } </script> ``` 在上述代码中,我们使用了`FormData`对象将图片文件封装起来,并通过`fetch`函数将其发送给后端接口。在这里,我们假设后端接口的地址为`http://your-backend-api.com/uploadImage`,并且接口的请求方式为`POST`,请求体中传递了一个名为`file`的属性,其值为刚才读取的图片文件。 Java后端代码: ``` @PostMapping("/uploadImage") public ResponseEntity<?> uploadImage(@RequestParam("file") MultipartFile file) { // 处理文件数据 // ... return ResponseEntity.ok("图片上传成功"); } ``` 在后端代码中,我们使用了Spring Boot框架,定义了一个POST请求的接口`/uploadImage`,并且使用`@RequestParam`注解将请求体中的`file`属性转换为`MultipartFile`类型的对象。然后就可以对图片数据进行处理了。 以上就是一个完整的前后端交互的解决方案,希望能够对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值