记录一个在微信开发中用到的https通信工具类,以后会用到的。

  

  用于https通信的证书信任管理器

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; /**
* 证书信任管理器(用于https请求)
*/
public class MyX509TrustManager implements X509TrustManager {
/**
* create by yyc 2017年6月27日上午10:24:49
*/
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// TODO Auto-generated method stub } /**
* create by yyc 2017年6月27日上午10:24:49
*/
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// TODO Auto-generated method stub } /**
* create by yyc 2017年6月27日上午10:24:49
*/
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}

  httpRequest方法,就是用于https通信的,方法传入请求的url,请求的方式(如:GET,POST),请求发送的数据等

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
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 org.apache.commons.httpclient.HttpStatus; /**
* 编写一个用于发起https请求的工具类WeiXinNetWorkUtil 访问网络用到的工具类
*/
public class WeiXinNetWorkUtil {
/**
* 发起Https请求
*
* @param reqUrl
* 请求的URL地址
* @param requestMethod
* 请求的方法
* @param outputStr
* 提交的数据
* @return 响应后的字符串(可能是json、xml或其它,但都是String型的) httpRequest方法是请求一个https地址,
* 参数requestMethod为字符串“GET”或者“POST”,传null或者“”默认为get方式,
* 参数outputStr为一个要提交的字符串,不为""或null时,requestMethod为“POST”。
*/
public static String httpRequest(String reqUrlString, String requestMethod, String outputStr) {
URL url;
HttpsURLConnection conn = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferReader = null;
StringBuffer resultData = new StringBuffer();
try {
// 创建url资源
url = new URL(reqUrlString);
// 建立http连接
conn = (HttpsURLConnection) url.openConnection(); // 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() }; SSLContext ctx = SSLContext.getInstance("SSL", "SunJSSE");
ctx.init(null, tm, new java.security.SecureRandom()); conn.setSSLSocketFactory(ctx.getSocketFactory());
conn.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
}); conn.setDoInput(true); // 允许输入流,即允许下载 conn.setDoOutput(true); // 允许输出流,即允许上传
conn.setUseCaches(false); // 是否使用缓冲
if (null != requestMethod && !"".equals(requestMethod)) {
conn.setRequestMethod(requestMethod); // 使用指定的方式
} else {
conn.setRequestMethod("GET"); // 使用get请求
} // 当有数据需要提交时
if (null != outputStr && !"".equals(outputStr)) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.flush();
// 释放资源
if (outputStream != null) {
outputStream.close();
outputStream = null;
}
} conn.connect();// 开始连接请求 // 请求返回的状态
if (conn.getResponseCode() == HttpStatus.SC_OK) { System.out.println("https网络连接成功,返回码:"+conn.getResponseCode());
inputStream = conn.getInputStream(); // 获取输入流
inputStreamReader = new InputStreamReader(inputStream);
bufferReader = new BufferedReader(inputStreamReader);
String inputLine;
while ((inputLine = bufferReader.readLine()) != null) {// 将返回的输入流转换成字符串
resultData.append(inputLine + "\n");
} // 释放资源
if (bufferReader != null) {
bufferReader.close();
bufferReader = null;
}
if (inputStreamReader != null) {
inputStreamReader.close();
inputStreamReader = null;
}
if (inputStream != null) {
inputStream.close();
inputStream = null;
}
}else{
System.out.println("https网络连接错误,错误码:"+conn.getResponseCode());
}
} catch (ConnectException ce) {
System.err.println("Weixin server connection timed out.");
ce.printStackTrace();
} catch (Exception e) {
System.err.println("https request error.");
e.printStackTrace();
} finally {
// 断开网络连接
conn.disconnect();
} return resultData.toString();
} }

20170822发现通过上述方式发送数据,对方在通过如下方式不能接收:

    byte[] bytes = null;
try {
final ServletInputStream inputStream = request.getInputStream();
ServletInputStream iii = request.getInputStream();
int len = request.getContentLength();
bytes = new byte[len];
iii.read(bytes, 0, len);
} catch (IOException e) {
e.printStackTrace();
}
String string = new String (bytes);
System.out.println(string);

解决方法:发送数据时,不用OutputStream来将数据放到输出流中 ,用它的一个子类(DataOutputStream)就可以。

如下:

OutputStream outputStream = conn.getOutputStream();
// 注意编码格式,防止中文乱码
DataOutputStream out=new DataOutputStream(outputStream);
out.write(outputStr.getBytes("UTF-8"));
// outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.flush();
out.flush();
// 释放资源
if (null != outputStream){
outputStream.close();
}
if (null != out){
out.close();
}

Https通信工具类的更多相关文章

  1. Http、Https请求工具类

    最近在做微信开发,使用http调用第三方服务API,有些是需要https协议,通过资料和自己编码,写了个支持http和https的工具类,经验证可用,现贴出来保留,也供需要的人使用(有不足的地方,也请 ...

  2. 微信https请求工具类

    工作中用到的微信https请求工具类. package com.gxgrh.wechat.tools; import com.gxgrh.wechat.wechatapi.service.System ...

  3. 我的Android进阶之旅------>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类

    下面是一个Android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确,也不需要验证服务器证书中的域名是否有效. (PS:建议下 ...

  4. java并发编程系列原理篇--JDK中的通信工具类Semaphore

    前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...

  5. HttpClient发起Http/Https请求工具类

    <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl ...

  6. Java 发送 Https 请求工具类 (兼容http)

    依赖 jsoup-1.11.3.jar <dependency> <groupId>org.jsoup</groupId> <artifactId>js ...

  7. Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+

    建议使用4.+版本,避免一些不必要的bug.4.+版本文档地址:https://www.cnblogs.com/shanya/articles/16062256.html SerialPortUtil ...

  8. Java 实现Https访问工具类 跳过ssl证书验证

    不多BB ,代码直接粘贴可用 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.F ...

  9. HttpClient 通信工具类

    package com.taotao.web.service; import java.util.ArrayList; import java.util.List; import java.util. ...

随机推荐

  1. poj 1717==洛谷P1282 多米诺骨牌

    Dominoes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6571   Accepted: 2178 Descript ...

  2. 一个经验丰富的网站建设程序员的CSS资料

    没有就不能活的 53 个 CSS 技术 对新手实用的 20 个 CSS 建议 快速编写更好 CSS 代码的 5 种方法 50+ 个 CSS 创意案例和教程 101 个 CSS 小贴士.教程和范例 CS ...

  3. Unit redis-server.service is masked.

    http://stackoverflow.com/questions/40317106/failed-to-start-redis-service-unit-redis-server-service- ...

  4. python的标准类型分类

    数据属性 储存模型 更新模型 访问模型 数字 标量/原子类型 不可变类型 直接存取 字符串 标量/原子类型 不可变类型 顺序 列表 容器  可变类型 顺序  元组 容器 不可变类型 顺序 字典 容器 ...

  5. 经典书Discrete.Mathematics上的大神

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  6. python基础25 -----python高级用法

    一.Event 1.为什么会有Event? 线程的一个关键特性就是每个线程的运行都是独立运行且状态不可预测.如果程序中的线程需要通过别的线程的状态来判断自己线程中的 某个程序是否需要执行,那么Even ...

  7. 剑指offer 面试4题

    面试4题: 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题代码一:二 ...

  8. c#中使用NetCDF存储二维数据的读写操作简单应用

                      [DllImport(                   [DllImport(                  [DllImport(             ...

  9. CSS 中z-index全解析(摘自阿里西西)

    z-index全解析 Z-index属性决定了一个HTML元素的层叠级别.元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言.一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶 ...

  10. LeetCode:二进制求和【67】

    LeetCode:二进制求和[67] 题目描述 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11" ...