微信https请求工具类
工作中用到的微信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请求工具类的更多相关文章
- Http、Https请求工具类
最近在做微信开发,使用http调用第三方服务API,有些是需要https协议,通过资料和自己编码,写了个支持http和https的工具类,经验证可用,现贴出来保留,也供需要的人使用(有不足的地方,也请 ...
- 我的Android进阶之旅------>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类
下面是一个Android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确,也不需要验证服务器证书中的域名是否有效. (PS:建议下 ...
- Java 发送 Https 请求工具类 (兼容http)
依赖 jsoup-1.11.3.jar <dependency> <groupId>org.jsoup</groupId> <artifactId>js ...
- HttpClient发起Http/Https请求工具类
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl ...
- Https通信工具类
记录一个在微信开发中用到的https通信工具类,以后会用到的. 用于https通信的证书信任管理器 import java.security.cert.CertificateException; im ...
- HTTP请求工具类
HTTP请求工具类,适用于微信服务器请求,可以自测 代码; /// <summary> /// HTTP请求工具类 /// </summary> public class Ht ...
- 【原创】标准HTTP请求工具类
以下是个人在项目开发过程中,总结的Http请求工具类,主要包括四种: 1.处理http POST请求[XML格式.无解压]: 2.处理http GET请求[XML格式.无解压]: 3.处理http P ...
- Http请求工具类(Java原生Form+Json)
package com.tzx.cc.common.constant.util; import java.io.IOException; import java.io.InputStream; imp ...
- java jdk原生的http请求工具类
package com.base; import java.io.IOException; import java.io.InputStream; import java.io.InputStream ...
随机推荐
- (转)nodejs中npm常用命令
npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...
- LUA5.3的BNF范式学习笔记
BNF巴科斯范式 {A} 表示 0 或多个 A , [A] 表示一个可选的 A chunk ::= block block ::= {stat} [retstat] stat ::= ‘;’ ...
- 自己写一个swap函数交换任意两个相同类型元素的值 对空指针的使用 字节大小的判断(二)了解原理
验证的代码: #include <stdio.h> int main(){ char c = 'z'; ) + (c << ) + () + 'a'; printf(" ...
- sprint 3 总结
1.要求: 演示可参考毕业设计答辩,包含两部分内容: 项目陈述,可综述项目.团队.开发过程等. 运行演示,实现的功能.业务.用户反馈等. 希望各组认真准备,拿出最好的阵容最好的状态,展示一学期的学习与 ...
- c语言的一个简单的链表
此程序为作业题: 但不忍丢弃成果: 所以记一下: 哦,对了,有一个易错点:在链表里,字符要用字符数组,不能用单个字符. #include<stdio.h>#include<stdio ...
- gulp使用引导
全局安装npm install –g gulp 安装到本地 npm install gulp –save-dev 新建gulpfile.js 编写文件内容并运行 var gulp = requi ...
- Hdu 1052 Tian Ji -- The Horse Racing
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 夺命雷公狗-----React---24--小案例之react经典案例todos(单条任务的删除)
我们的组建分析图 我们组建需要的是删除,数据流方式如下所示: 为了更方便下一步操作,先写个函数他 然后在Ul组建里面对她进行处理 然后在Zong组建里对数据进行处理,如下所示: 但是悲剧的一幕出现了, ...
- 使用宏命令撤销EXCEL工作表保护
EXCEL工作表编辑资料,设置了工作表保护后,不能对表格进行插入删除操作.如果没有密码,很简单:工具-选项—工作表保护——撤消工作表保护 就可以了.如果忘记密码,如下操作: 1. 打开文件 2. 工具 ...
- MVC Core
.NET Core 1.1 发布 文档下载资源汇总 https://www.microsoft.com/net/core#windowsvs2015 https://docs.microsoft.co ...