调用第三方接口时发现这么一个现象,都说在某月某日停止对HTTP请求的维护,改为HTTPS方式的请求。我觉得我需要未雨绸缪一下,免得到时候自己忘记了给自己挖坑。这边记录一下我自己的HTTPS请求工具类。

有必要了解下HTTP和HTTPS两种不同请求的区别。

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  HTTPS和HTTP的区别主要如下:

  1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

public class SSLClient extends DefaultHttpClient{public SSLClient() throws Exception{super();//传输协议需要根据自己的判断 SSLContext ctx = SSLContext.getInstance("TLSv1.2");X509TrustManager tm = new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}};ctx.init(null, new TrustManager[]{tm}, null);SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);ClientConnectionManager ccm = this.getConnectionManager();SchemeRegistry sr = ccm.getSchemeRegistry();sr.register(new Scheme("https", 443, ssf));}
}

其实和我之前接口调用中的相关博客改动较大的就是这个地方,因为我们的HTTPS请求方式是基于SSL证书的,所以普通的HTTP请求是不符合我们的需求的,图中的'TLSv1.2'所匹配的是jdk1.8版本,大家要根据自己的jdk版本自己匹配。

我不知道我的图为什么传不上来..... 实际上jdk1.6,1.7,1.8三个版本都可以传入'TLSv1.1'

实现这个https方法的信任管理器后,我们需要封装一下自己的get和post请求,我们先来看get请求

public static String doGet(String url, Map<String,String> map, String charset){HttpClient httpClient = null;HttpGet httpGet = null;String result = null;String urls = jointParamsToUrl(map,url);try{httpClient = new SSLClient();httpGet = new HttpGet(urls);HttpResponse response = httpClient.execute(httpGet);if(response != null){HttpEntity resEntity = response.getEntity();if(resEntity != null){result = EntityUtils.toString(resEntity,charset);}}}catch(Exception ex){ex.printStackTrace();}return result;}public static String jointParamsToUrl(Map<String,String> params,String url){if(params==null){return url;}StringBuffer temp = new StringBuffer();String param = "";for (String key : params.keySet()) {Object value = params.get(key);if(value!=null){String s = value.toString();if(StringUtils.isNotEmpty(s)){temp.append(key).append("=").append(s).append("&");}}}if(temp.length()>0){param = temp.substring(0,temp.length()-1);}if(url.charAt(url.length()-1)=='?'){url = url+"&"+param;}else {url = url+"?"+param;}return url;}

这个是get请求,将url和请求参数进行拼接,然后进行请求,记住一点,需要new出一个SSLClient(), httpClient = new SSLClient();这样就可以拿到相应的信任管理器。

public static String doPost(String url, Map<String,String> map, String charset){HttpClient httpClient = null;HttpPost httpPost = null;String result = null;try{httpClient = new SSLClient();httpPost = new HttpPost(url);//设置参数List<NameValuePair> list = new ArrayList<NameValuePair>();Iterator iterator = map.entrySet().iterator();while(iterator.hasNext()){Map.Entry<String,String> elem = (Map.Entry<String, String>) iterator.next();list.add(new BasicNameValuePair(elem.getKey(),elem.getValue()));}if(list.size() > 0){UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,charset);httpPost.setEntity(entity);}HttpResponse response = httpClient.execute(httpPost);if(response != null){HttpEntity resEntity = response.getEntity();if(resEntity != null){result = EntityUtils.toString(resEntity,charset);}}}catch(Exception ex){ex.printStackTrace();}return result;}

再就是post请求了,后期如果说有请求头的设计等需求,可以对比着我之前接口系列文档的相关文章进行编写。

  public static void main(String[] args) {String charset = "utf-8";String url="https://apis.map.qq.com/ws/coord/v1/translate";Map<String,String> createMap = new HashMap<String,String>();createMap.put("locations","39.12,116.83;30.21,115.43");createMap.put("type","3");createMap.put("key","");String message=doGet(url,createMap,charset);System.out.println(message);}

最后一个测试类进行测试,现在仅仅只是粗略看一下,等到后期用到再详细研究下。

HTTPS请求方式工具类相关推荐

  1. 前端请求接口post_程序员:HttpClient进行post请求的工具类,访问第三方接口HTTPS...

    HTTPS (英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure) 是一 ...

  2. JavaSocket编写发送TCP请求的工具类

    转自:https://blog.csdn.net/jadyer/article/details/8788303 package com.jadyer.util;import java.io.ByteA ...

  3. Http请求-hutool工具类的使用

    Http请求-hutool工具类的使用 前言 在日常java后端开发的工作中经常会遇到后端发起HTTP请求的情况,这里可以使用一个简单的工具类. 官方网址:Http请求-HttpRequest (hu ...

  4. uni-app进阶之https请求方式/状态管理【day11】

    uni-app进阶之https请求方式 传统HTTP存在安全问题: 1.如果明文用于通信,则内容可能被窃听: 2.如果未验证通信方的身份,通信方的身份可能被伪装: 3.无法证明消息的完整性,消息可能被 ...

  5. 超好用的后端发送http请求HttpUtils工具类(基于原生http连接,不需要另外导包)

    在项目中,为了实现一些特定的功能,我们常常需要发送http异步请求 ,为此需要特意封装一个实用的HttpUtils工具类 HttpUtils工具类内容如下: package com.zyw.secki ...

  6. 分享一个发送http请求的工具类

    分享一个发送http请求的工具类 maven依赖只需要导入一个 <dependencies><dependency><groupId>commons-httpcli ...

  7. http请求发送工具类

    直接引用的公司的工具类 依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifac ...

  8. 发送http请求的工具类

    大家工作中都会遇到使用http请求调用合作商接口的需求,下面分享一个封装好的http请求工具类 1.发送GET请求 /***发送GET方法的请求*/public static String sendG ...

  9. C#中的get和post请求(工具类)

    一,HttpPost public class HttpPost{public string Postdata(string strpost,string url) {//表示空字符串,字段为只读st ...

最新文章

  1. 中科院王飞跃:新的智能全球化将要来临,人工智能标准化为时尚早
  2. 用原生 js jquery 实现知乎收起答案功能
  3. Java长存!12个Java长久占居主要地位的原因
  4. 在计算机上创建一个本地用户账户,在工作组中,默认时每台Windows计算机的( )能够在本地计算机的SAM数据库中创建并管理本地用户账户。...
  5. Python基础:一起来面向对象 (二) 之搜索引擎
  6. Tomcat在修改代码后不会自动reload解决办法
  7. 算法6-1:哈希函数
  8. 工作中的javascript代码收集及整理
  9. python王者归来 pdf_OpenStack开源云:王者归来 PDF 下载
  10. ThingJS平台制作第一人称视角下的巡更效果
  11. python 仅保留数字_Python基本语法元素 | 语法元素分析
  12. 35岁程序员的独家面试经历
  13. 纺织人工智能的下一个独角兽——智能验布机
  14. ADO获取表的所有字段名
  15. 学者CIO邓遵红:让人文梦想照进职业现实
  16. Pravega Flink Connector Table API 进阶功能探秘
  17. C# 编译后执行bat等脚本文件 运行脚本文件 执行Copy 执行XCopy
  18. mysql 存储过程 高并发_解决数据库高并发常见方案
  19. 华为精益看板探索之路【PPT+注解】
  20. 阿昆同学的Java学习日记Day5

热门文章

  1. Python爬虫底层知识简介 - AI小白进阶之路
  2. 刀片服务器怎么连接显示屏,CMC是如何连接的 刀片管理模块的秘密
  3. python机械臂坐标变换——实现机械臂末端相对移动
  4. Redis数据类型汇总
  5. 私有云是伪命题:真正的私有云 ≈ 公有云
  6. 提高模型泛化能力的几大方法
  7. 信号与系统第三章复习
  8. linux下网络播放器,月亮播放器:Linux无广告看片神器
  9. python 面试题
  10. Camera构图之三分法