java调用其他java项目的Https接口

项目中是这样的: 用户拿出二维码展示,让机器识别二维码, 机器调用开门的后台系统接口, 然后开门的后台系统接口需要调用管理系统的接口, 管理系统需要判断能不能开门.这两个系统是互相独立的.当时使用http调用是没有问题的.当时后来要求必须用https.废话不说,直接代码:

HttpsUtils工具类代码是:
package org.wiegand.TestZone;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class HttpsUtils {

  public static String METHOD_GET = "GET";
  public static String METHOD_POST = "POST";

  public static int DEF_CONNECT_TIMEOUT = 2 * 1000;
  public static int DEF_READ_TIMEOUT = 8 * 1000;
  public static Charset DEF_CHARSET = Charset.forName("UTF-8");

  public static void main(String[] args) {
    JSONObject x = HttpsUtils.doGetAuthorization("https://amzrealtime.despatchcloud.co.uk/ws/v1/wsfulfilment/list_fulfilment_clients");
    System.out.println(x);
  }

  public static JSONObject doGetAuthorization(String url) {
    Map<String, String> headers = new HashMap<>();
    headers.put("Authorization", "DC 454");
    String xx = HttpsUtils.Get(url, headers);
    return JSONObject.parseObject(xx);
  }

  public static TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
      return new java.security.cert.X509Certificate[]{};
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }
  }};

  public static void trustAll() {
    try {
      SSLContext sc = SSLContext.getInstance("TLS");
      sc.init(null, trustAllCerts, new java.security.SecureRandom());
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  static {
    trustAll();
  }

  public static String Get(String urlString) {
    return HttpsGo(urlString, METHOD_GET, null, null, DEF_CONNECT_TIMEOUT, DEF_READ_TIMEOUT);
  }

  public static String Get(String urlString, Map<String, String> headers) {
    return HttpsGo(urlString, METHOD_GET, headers, null, DEF_CONNECT_TIMEOUT, DEF_READ_TIMEOUT);
  }

  public static String Get(String urlString, Map<String, String> headers, Map<String, String> params) {
    if (params != null && params.isEmpty() == false) {
      StringBuffer url = new StringBuffer(urlString);
      try {
        boolean isFirst = true;
        if (urlString.contains("?")) {
          if (urlString.endsWith("&") == false && urlString.contains("&")) {
            isFirst = false;
          }
        } else {
          url.append('?');
        }
        String paramsEncoding = DEF_CHARSET.name();
        for (Map.Entry<String, String> entry : params.entrySet()) {
          if (isFirst) {
            isFirst = false;
          } else {
            url.append('&');
          }
          url.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
          url.append('=');
          url.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
        }
      } catch (Exception e) {
      }
      return Get(url.toString(), headers);
    } else {
      return Get(urlString, headers);
    }
  }

  public static String Post(String urlString, String contentType, byte[] content) {
    Map<String, String> headers = new HashMap<String, String>(1);
    headers.put("Content-Type", contentType);
    return HttpsGo(urlString, METHOD_POST, headers, content, DEF_CONNECT_TIMEOUT, DEF_READ_TIMEOUT);
  }

  public static String FormPost(String urlString, String content) {
    Map<String, String> headers = new HashMap<String, String>(1);
    headers.put("Content-Type", String.format("application/x-www-form-urlencoded; charset=%s", DEF_CHARSET.name()));
    return HttpsGo(urlString, METHOD_POST, null, content.getBytes(DEF_CHARSET), DEF_CONNECT_TIMEOUT, DEF_READ_TIMEOUT);
  }

  public static String XmlPost(String urlString, String content) {
    Map<String, String> headers = new HashMap<String, String>(1);
    headers.put("Content-Type", String.format("text/html; charset=%s", DEF_CHARSET.name()));
    return HttpsGo(urlString, METHOD_POST, headers, content.getBytes(DEF_CHARSET), DEF_CONNECT_TIMEOUT, DEF_READ_TIMEOUT);
  }

  public static String JsonPost(String urlString, Object content) {
    return JsonPost(urlString, JSONObject.toJSONString(content, SerializerFeature.DisableCircularReferenceDetect));
  }

  public static String JsonPost(String urlString, String content) {
    Map<String, String> headers = new HashMap<String, String>(1);
    headers.put("Content-Type", String.format("application/json; charset=%s", DEF_CHARSET.name()));
    return HttpsGo(urlString, METHOD_POST, headers, content.getBytes(DEF_CHARSET), DEF_CONNECT_TIMEOUT, DEF_READ_TIMEOUT);
  }

  public static String HttpsGo(String urlString, String method, Map<String, String> headers, byte[] content, int connectTimeout, int readTimeout) {
    HttpsURLConnection conn = null;
    try {
      conn = (HttpsURLConnection) new URL(urlString).openConnection();

      SSLContext sc = SSLContext.getInstance("SSL");
      sc.init(null, trustAllCerts, new SecureRandom());
      conn.setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
          return true;
        }
      });
      conn.setSSLSocketFactory(sc.getSocketFactory());

      conn.setRequestMethod(method);
      conn.setDoOutput(true);
      conn.setDoInput(true);
      conn.setUseCaches(false);
      conn.setConnectTimeout(connectTimeout);
      conn.setReadTimeout(readTimeout);

      if (headers != null) {
        for (Map.Entry<String, String> entry : headers.entrySet()) {
          conn.addRequestProperty(entry.getKey(), entry.getValue());
        }
      }
      if (content != null) {
        if (headers == null || headers.containsKey("Content-Length") == false) {
          conn.addRequestProperty("Content-Length", Integer.toString(content.length));
        }
        OutputStream output = null;
        try {
          output = conn.getOutputStream();
          output.write(content);
          output.flush();
        } finally {
          if (output != null) {
            try {
              output.close();
            } catch (Exception e) {
            }
          }
        }
      }

      return readContent(conn.getResponseCode() == 200 ? conn.getInputStream() : conn.getErrorStream(), getCharset(conn));
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    } finally {
      if (conn != null) {
        conn.disconnect();
      }
    }
  }

  public static String encodeParams(Map<String, String> params, String paramsEncoding) throws Exception {
    boolean isFirst = true;
    StringBuilder encodedParams = new StringBuilder();
    for (Map.Entry<String, String> entry : params.entrySet()) {
      if (isFirst) {
        isFirst = false;
      } else {
        encodedParams.append('&');
      }
      encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
      encodedParams.append('=');
      encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
    }
    return encodedParams.toString();
  }

  public static String CHARSET_DEF = DEF_CHARSET.name();
  private static String CHARSET_STR = "charset=";
  private static int CHARSET_STR_LEN = CHARSET_STR.length();

  private static String getCharset(HttpURLConnection conn) {
    String contentType = conn.getHeaderField("Content-Type");
    int length = contentType != null ? contentType.length() : 0;
    if (length < CHARSET_STR_LEN) {
      return CHARSET_DEF;
    }
    int pos = contentType != null ? contentType.indexOf("charset=") : -1;
    if (pos < 0) {
      return CHARSET_DEF;
    }
    return contentType.substring(pos + CHARSET_STR_LEN);
  }

  private static String readContent(InputStream input, String charset) throws Exception {
    try {
      int APPEND_LEN = 4 * 1024;
      int offset = 0;
      byte[] data = new byte[APPEND_LEN];
      while (true) {
        int len = input.read(data, offset, data.length - offset);
        if (len == -1) {
          break;
        }
        offset += len;
        if (offset >= data.length) {
          data = Arrays.copyOf(data, offset + APPEND_LEN);
        }
      }
      return charset != null ? new String(data, 0, offset, charset) : new String(data, 0, offset);
    } finally {
      if (input != null) {
        try {
          input.close();
        } catch (Exception e) {
        }
      }
    }
  }
}

我的项目中调用的是 HttpsUtils.Get(utlStr) 这个接口

开门系统接口如下图:

 

管理系统的接口,如下图,可以发现已经获取到了数据

 

 

明显的看到管理系统返回的数据给开门系统,告诉开门系统到底要不要开门

 

 

版权声明:本文为qq_26106607原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26106607/article/details/103100512

智能推荐

Python 中各种imread函数的区别与联系

  原博客:https://blog.csdn.net/renelian1572/article/details/78761278 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误。如果你正好也对此感到困惑可以看下这篇总结。当然,要了解具体的细节,还是应该 read the fuc...

用栈判断一个字符串是否平衡

注: (1)本文定义:左符号:‘(’、‘[’、‘{’…… 右符号:‘)’、‘]’、‘}’……. (2)所谓的字符串的符号平衡,是指字符串中的左符号与右符号对应且相等,如字符串中的如‘(&r...

JAVA环境变量配置

位置 计算机->属性->高级系统设置->环境变量 方式一 用户变量新建path 系统变量新建classpath 方式二 系统变量 新建JAVA_HOME,值为JDK路径 编辑path,前加 方式三 用户变量新建JAVA_HOME 此路径含lib、bin、jre等文件夹。后运行tomcat,eclipse等需此变量,故最好设。 用户变量编辑Path,前加 系统可在任何路径识别jav...

常用的伪类选择器

CSS选择器众多 CSS选择器及权重计算 最常用的莫过于类选择器,其它的相对用的就不会那么多了,当然属性选择器和为类选择器用的也会比较多,这里我们就常用的伪类选择器来讲一讲。 什么是伪类选择器? CSS伪类是用来添加一些选择器的特殊效果。 常用的为类选择器 状态伪类 我们中最常见的为类选择器就是a标签(链接)上的为类选择器。 当我们使用它们的时候,需要遵循一定的顺序问题,否则将可能出现bug 注意...

ButterKnife的使用介绍及原理探究(六)

前面分析了ButterKnife的源码,了解其实现原理,那么就将原理运用于实践吧。 github地址:       点击打开链接 一、自定义注解 这里为了便于理解,只提供BindView注解。 二、添加注解处理器 添加ViewInjectProcessor注解处理器,看代码, 这里分别实现了init、getSupportedAnnotationTypes、g...

猜你喜欢

1.写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串。考试复习题库1|要求:只能使用单字符比较操作。

1.写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串。 要求只能使用单字符比较操作。 参考代码: 实验结果截图:...

小demo:slideDown()实现二级菜单栏下拉效果

效果如下,鼠标经过显示隐藏的二级菜单栏 但是这样的时候会存在一个问题,就是鼠标快速不停移入移出会导致二级菜单栏闪屏现象,一般需要使用stop()来清除事件  ...

基于docker环境的mysql主从复制

1、安装docker 可以参考之前的博客,之前写过了~ 2、拉取mysql镜像 3、创建mysql01和mysql02实例 主: 从: 4、进入容器修改配置 1)修改主数据库配置 进入主数据库容器 切换到 etc/mysql/目录下 查看可以看到my.cnf文件,使用vim编辑器打开,但是需要提前安装 安装vim命令: 安装成功后,修改my.cnf文件 新增配置后的my.cnf: binlog 日...

机器学习算法之决策树

原文:http://www.jianshu.com/p/6eecdeee5012 决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树,如: 决策树 在使用模型进行预测时,根据输入参数依次在各个判断节点进行判断游走,最后到叶子节点即为预测结果。 如何构造决策树 决策树算法的核心是通过对数据的学习,选定判断节点,构造一颗合适的决策树。 假设我们从用户...

Netty实现一个简单的RPC框架

微服务 微服务通讯 API构建需要考虑的因素 通讯协议 文本协议或者二进制协议 支持的调用方式:单向、双向、Streaming API定义与声明 API容错、可伸缩性 RPC框架 REST http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm REST即Representational State Transf...