工作中用到的微信https请求工具类。

package com.gxgrh.wechat.tools;

import com.gxgrh.wechat.wechatapi.service.SystemApiService;
import org.apache.http.HttpConnection;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import javax.net.ssl.*;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map; /**发送https请求的工具类
* Created by Administrator on 2016/9/27.
*/
@Component
public class HttpTool { @Autowired
private IoTool ioTool; private static final Logger logger = LogManager.getLogger(HttpTool.class); /**
* 忽视证书HostName
*/
private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslsession) {
System.out.println("WARNING: Hostname is not matched for cert.");
return true;
}
}; /**
* Ignore Certification
*/
private static TrustManager ignoreCertificationTrustManger = new X509TrustManager(){
private X509Certificate[] certificates;
public void checkClientTrusted(X509Certificate certificates[],
String authType) throws CertificateException {
if (this.certificates == null) {
this.certificates = certificates;
}
}
public void checkServerTrusted(X509Certificate[] ax509certificate,
String s) throws CertificateException {
if (this.certificates == null) {
this.certificates = ax509certificate;
}
}
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return new java.security.cert.X509Certificate[0];
}
}; public String sendSSLGetMethod(String urlString) throws Exception{
String repString = null;
InputStream is = null;
HttpsURLConnection connection = null;
try { URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf);
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
is.close();
is = null;
}
if(null != connection){
connection.disconnect();
}
}
return repString;
} public String sendSSLPostMethod(String urlString,String postData) throws Exception{
String repString = null;
InputStream is = null;
HttpsURLConnection connection = null;
try { URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("content-type","text/json");
connection.setRequestProperty("content-length",String.valueOf(postData.getBytes().length));
connection.getOutputStream().write(postData.getBytes("utf-8"));
connection.getOutputStream().flush();
connection.getOutputStream().close();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf);
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
is.close();
is = null;
}
if(null != connection){
connection.disconnect();
}
}
return repString;
} /**
* 上传文件到微信服务器
* @param urlString 上传的目标url
* @param filePath 文件路路径
* @Param formDataName 表单id
* @return
* @throws Exception
*/
public String sendSSLMutiPartFormData(String urlString,String filePath,String formDataName) throws Exception{
String repString = null;
InputStream is = null;
OutputStream out = null;
HttpsURLConnection connection = null;
final String BOUNDARYSTR = ""+System.currentTimeMillis();
final String BOUNDARY = "--"+BOUNDARYSTR+"\r\n";
try{
File file = new File(filePath);
if(!file.exists() || !file.isFile()){
String errorMsg = "文件["+filePath+"]不存在。无法上传。";
logger.error(errorMsg);
throw new Exception(errorMsg);
}
URL url = new URL(urlString);
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
// 设置请求头信息
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-type", "multipart/form-data;boundary=" + BOUNDARYSTR);
StringBuilder sb = new StringBuilder();
sb.append(BOUNDARY);
sb.append("Content-Disposition: form-data;name=\""+formDataName+"\";filename=\""
+ file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
out = new DataOutputStream(connection.getOutputStream());
// 输出表头
out.write(head);
// 文件正文部分
// 把文件已流文件的方式 推入到url中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = bis.read(bufferOut,0,1024)) != -1) {
out.write(bufferOut, 0, bytes);
}
bis.close();
byte[] foot = ("\r\n--" + BOUNDARYSTR + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
out.write(foot);
out.flush();
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf);
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
}catch(Exception ex){
logger.error(ex.getMessage());
ex.printStackTrace();
}finally {
if(null != is){
is.close();
is = null;
}
if(null != connection){
connection.disconnect();
}
}
return repString;
} /**
*
* @param urlString
* @return
*/
public Map<String,Object> sendSSLGetDownloadMedia(String urlString){
String fileName = null;
byte[] repData = null;
InputStream is = null;
Map<String,Object> resultInfo = null;
HttpsURLConnection connection = null;
try { URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf); /**从以下头部数据解析出文件名
* Content-disposition: attachment; filename="MEDIA_ID.jpg"
*/
String contentDisposition = connection.getHeaderField("Content-disposition");
if(contentDisposition != null){
String[] contentDispositionArray = contentDisposition.split(";");
for(String content:contentDispositionArray){
if(content.contains("filename")){
String[] contentArry = content.split("=");
fileName = contentArry[1];
fileName = fileName.replaceAll("\"","");
}
}
}
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repData = this.ioTool.getByteArrayFromInputStream(is);
resultInfo = new HashMap<String,Object>();
resultInfo.put("fileName",fileName);
resultInfo.put("data",repData);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
} }
if(null != connection){
connection.disconnect();
}
}
return resultInfo;
} /**
*
* @param urlString
* @param postData
* @return
*/
public Map<String,Object> sendSSLPostDownloadMedia(String urlString, String postData){
String fileName = null;
byte[] repData = null;
InputStream is = null;
Map<String,Object> resultInfo = null;
HttpsURLConnection connection = null;
try{
URL url = new URL(urlString);
/*
* use ignore host name verifier
*/
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
connection = (HttpsURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("content-type","text/json");
connection.setRequestProperty("content-length",String.valueOf(postData.getBytes().length));
connection.getOutputStream().write(postData.getBytes("utf-8"));
connection.getOutputStream().flush();
connection.getOutputStream().close();
// Prepare SSL Context
TrustManager[] tm = { ignoreCertificationTrustManger };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
connection.setSSLSocketFactory(ssf); /**从以下头部数据解析出文件名
* Content-disposition: attachment; filename="MEDIA_ID.jpg"
*/
String contentDisposition = connection.getHeaderField("Content-disposition");
String[] contentDispositionArray = contentDisposition.split(";");
for(String content:contentDispositionArray){
if(content.contains("filename")){
String[] contentArry = content.split("=");
fileName = contentArry[1];
fileName = fileName.replaceAll("\"","");
}
}
if(connection.getResponseCode() != 200){ }
is = connection.getInputStream();
repData = this.ioTool.getByteArrayFromInputStream(is);
resultInfo = new HashMap<String,Object>();
resultInfo.put("fileName",fileName);
resultInfo.put("data",repData);
}catch (Exception ex){
logger.error(ex.getMessage());
ex.printStackTrace();
}finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
}
}
if(null != connection){
connection.disconnect();
}
}
return resultInfo; } /**
*
* @param urlString
* @return
*/
public String sendGetMethod(String urlString){
String repString = null;
InputStream is = null;
URLConnection connection = null;
try { URL url = new URL(urlString);
connection = url.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
} }
}
return repString;
} /**
*
* @param urlString
* @param postData
* @return
*/
public String sendPostMethod(String urlString, String postData){
String repString = null;
InputStream is = null;
URLConnection connection = null;
try { URL url = new URL(urlString);
connection = url.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("content-type","text/json");
connection.getOutputStream().write(postData.getBytes("utf-8"));
connection.getOutputStream().flush();
connection.getOutputStream().close();
connection.getOutputStream().close();
is = connection.getInputStream();
repString = ioTool.getStringFromInputStream(is);
} catch (Exception ex) {
logger.error(ex.getMessage());
ex.printStackTrace();
} finally {
if(null != is){
try{
is.close();
is = null;
}catch (Exception e){
e.printStackTrace();
} }
}
return repString;
} /**
* 判断某个请求是否是异步的
* @param request
* @return
*/
public boolean isAsynchronousRequest(HttpServletRequest request){ //Jquery的ajax请求默认会加上这个头部
String jQueryAjaxHeader = request.getHeader("x-requested-with");
//原生js使用ajax请加上一个头部参数请求头部:XMLHttpRequest.setRequestHeader("RequestType","AJAX");
String customAjaxHeader = request.getHeader("RequestType");
if(( Validate.isString(jQueryAjaxHeader) && jQueryAjaxHeader.equals("XMLHttpRequest"))
|| (Validate.isString(customAjaxHeader) && customAjaxHeader.equals("AJAX")) ){
return true;
}
return false;
}
}

主要难点是微信需要https请求。工具类里另外还封装了post方法上传素材,post方法下载素材,get方法下载素材。

直接拷贝代码会有错误,主要是logger部分的代码和还有IoTool工具类,可以自己修改下。

微信https请求工具类的更多相关文章

  1. Http、Https请求工具类

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

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

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

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

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

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

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

  5. Https通信工具类

    记录一个在微信开发中用到的https通信工具类,以后会用到的. 用于https通信的证书信任管理器 import java.security.cert.CertificateException; im ...

  6. HTTP请求工具类

    HTTP请求工具类,适用于微信服务器请求,可以自测 代码; /// <summary> /// HTTP请求工具类 /// </summary> public class Ht ...

  7. 【原创】标准HTTP请求工具类

    以下是个人在项目开发过程中,总结的Http请求工具类,主要包括四种: 1.处理http POST请求[XML格式.无解压]: 2.处理http GET请求[XML格式.无解压]: 3.处理http P ...

  8. Http请求工具类(Java原生Form+Json)

    package com.tzx.cc.common.constant.util; import java.io.IOException; import java.io.InputStream; imp ...

  9. java jdk原生的http请求工具类

    package com.base; import java.io.IOException; import java.io.InputStream; import java.io.InputStream ...

随机推荐

  1. XEP-0078:非SASL认证

    XEP-0078:非SASL认证 抽象: 这个文件规定了使用Jabber的Jabber的服务器和服务认证的协议:智商:AUTH命名空间.注意哦:本文规定的协议,取而代之的SASL认证的被取代,如RFC ...

  2. PHP数组内容不重复组合排列算法

    最近在做ecshop的商品库存模块,分别给一款商品的多个属性组合设置库存,如下图: 一款手机有不同颜色,屏幕尺寸,系统和电量,都要设置不同的库存,如果都要手动选择属性组合,则会耗费很多不必要的时间.假 ...

  3. Linux命令集合

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  4. 寿司点餐系统Sprint1总结

    为期十天的一个冲刺,说长不长,说短不短.从一开始的接收课程任务到第一次聚集讨论. 确定方案.实行方案,再到最后的决定结束第一个冲刺,都是大家一起讨论着加小小的默契一步步 向前.没有完美,但是总体完成的 ...

  5. CentOS手动编译安装gcc

    最近尝试了fedora.ubuntu.mint.debian.opensuse等多种linux发行版,与CentOS比较之后还是感觉之前用的CentOS比较熟悉,比较习惯.现在CentOS的最新版本为 ...

  6. [WCF]DomainServices客户端操作异常处理

    作为个人备忘,不做排版.此扩展函数用于DomainServices的Load及SubmitChanges时处理Error信息,包括验证消息.实体冲突. public static string ToE ...

  7. [已解决] No syntax specified for the proto file : xxx.proto

    在使用protobuf生成相应类文件如java文件的时候需要指定proto的版本, 如: syntax = "proto2"; package my_package; messag ...

  8. Python—sqlalchemy

    SQLAlchemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作. #Dialect用于和数据API进行交流,根据配置文 ...

  9. T-sql 查询

    ------------------case---when-------的使用--------------------- select  userAccount , eatingDate ,    c ...

  10. TOJ 2776 CD Making

    TOJ 2776题目链接http://acm.tju.edu.cn/toj/showp2776.html 这题其实就是考虑的周全性...  贡献了好几次WA, 后来想了半天才知道哪里有遗漏.最大的问题 ...