packagecom.ray.weixin.gz.util;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importorg.apache.http.Consts;importorg.apache.http.Header;importorg.apache.http.HeaderElement;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.HttpStatus;importorg.apache.http.NameValuePair;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.entity.ContentType;importorg.apache.http.entity.StringEntity;importorg.apache.http.entity.mime.MultipartEntityBuilder;importorg.apache.http.entity.mime.content.FileBody;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.protocol.BasicHttpContext;importorg.apache.http.util.EntityUtils;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;/*** HTTP请求封装,建议直接使用sdk的API*/
public classHttpHelper {/*** @desc :1.发起GET请求
*
*@paramurl
*@returnJSONObject
*@throwsException*/
public static JSONObject doGet(String url) throwsException {//1.生成一个请求
HttpGet httpGet = newHttpGet(url);//2.配置请求的属性
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build();//2000
httpGet.setConfig(requestConfig);//3.发起请求,获取响应信息//3.1 创建httpClient
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse response= null;try{//3.2 发起请求,获取响应信息
response = httpClient.execute(httpGet, newBasicHttpContext());//如果返回结果的code不等于200,说明出错了
if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" +response.getStatusLine().getStatusCode()+ ", url=" +url);return null;
}//4.解析请求结果
HttpEntity entity = response.getEntity(); //reponse返回的数据在entity中
if (entity != null) {
String resultStr= EntityUtils.toString(entity, "utf-8"); //将数据转化为string格式
System.out.println("GET请求结果:"+resultStr);
JSONObject result= JSON.parseObject(resultStr); //将String转换为 JSONObject
if(result.getInteger("errcode")==null) {returnresult;
}else if (0 == result.getInteger("errcode")) {returnresult;
}else{
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);int errCode = result.getInteger("errcode");
String errMsg= result.getString("errmsg");throw new Exception("error code:"+errCode+", error message:"+errMsg);
}
}
}catch(IOException e) {
System.out.println("request url=" + url + ", exception, msg=" +e.getMessage());
e.printStackTrace();
}finally{if (response != null) try{
response.close();//释放资源
}catch(IOException e) {
e.printStackTrace();
}
}return null;
}/**2.发起POST请求
* @desc :
*
*@paramurl 请求url
*@paramdata 请求参数(json)
*@return*@throwsException JSONObject*/
public static JSONObject doPost(String url, Object data) throwsException {//1.生成一个请求
HttpPost httpPost = newHttpPost(url);//2.配置请求属性//2.1 设置请求超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build();
httpPost.setConfig(requestConfig);//2.2 设置数据传输格式-json
httpPost.addHeader("Content-Type", "application/json");//2.3 设置请求实体,封装了请求参数
StringEntity requestEntity = new StringEntity(JSON.toJSONString(data), "utf-8");
httpPost.setEntity(requestEntity);//3.发起请求,获取响应信息//3.1 创建httpClient
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse response= null;try{//3.3 发起请求,获取响应
response = httpClient.execute(httpPost, newBasicHttpContext());if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" +response.getStatusLine().getStatusCode()+ ", url=" +url);return null;
}//获取响应内容
HttpEntity entity =response.getEntity();if (entity != null) {
String resultStr= EntityUtils.toString(entity, "utf-8");
System.out.println("POST请求结果:"+resultStr);//解析响应内容
JSONObject result =JSON.parseObject(resultStr);if(result.getInteger("errcode")==null) {returnresult;
}else if (0 == result.getInteger("errcode")) {returnresult;
}else{
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);int errCode = result.getInteger("errcode");
String errMsg= result.getString("errmsg");throw new Exception("error code:"+errCode+", error message:"+errMsg);
}
}
}catch(IOException e) {
System.out.println("request url=" + url + ", exception, msg=" +e.getMessage());
e.printStackTrace();
}finally{if (response != null) try{
response.close();//释放资源
}catch(IOException e) {
e.printStackTrace();
}
}return null;
}/*** @desc : 3.上传文件
*
*@paramurl 请求url
*@paramfile 上传的文件
*@return*@throwsException JSONObject*/
public static JSONObject uploadMedia(String url, File file) throwsException {
HttpPost httpPost= newHttpPost(url);
CloseableHttpResponse response= null;
CloseableHttpClient httpClient=HttpClients.createDefault();
RequestConfig requestConfig= RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build();
httpPost.setConfig(requestConfig);//2.3 设置请求实体,封装了请求参数
HttpEntity requestEntity = MultipartEntityBuilder.create().addPart("media",new FileBody(file, ContentType.create("multipart/form-data", Consts.UTF_8), file.getName())).build();//FileEntity requestEntity = new FileEntity(file,ContentType.MULTIPART_FORM_DATA);
httpPost.setEntity(requestEntity);try{
response= httpClient.execute(httpPost, newBasicHttpContext());if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" +response.getStatusLine().getStatusCode()+ ", url=" +url);return null;
}
HttpEntity entity=response.getEntity();if (entity != null) {
String resultStr= EntityUtils.toString(entity, "utf-8");
JSONObject result=JSON.parseObject(resultStr);//上传临时素材成功
if (result.getString("errcode")== null) {//成功//result.remove("errcode");//result.remove("errmsg");
returnresult;
}else{
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);int errCode = result.getInteger("errcode");
String errMsg= result.getString("errmsg");throw new Exception("error code:"+errCode+", error message:"+errMsg);
}
}
}catch(IOException e) {
System.out.println("request url=" + url + ", exception, msg=" +e.getMessage());
e.printStackTrace();
}finally{if (response != null) try{
response.close();//释放资源
}catch(IOException e) {
e.printStackTrace();
}
}return null;
}/*** @desc : 上传PDF
* 见微信电子发票章节
* 9. 向用户提供发票或其它消费凭证PDF
*
*@paramurl
*@paramfile
*@return*@throwsException
* JSONObject*/
public static JSONObject uploadPDF(String url, File file) throwsException {
HttpPost httpPost= newHttpPost(url);
CloseableHttpResponse response= null;
CloseableHttpClient httpClient=HttpClients.createDefault();
RequestConfig requestConfig= RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build();
httpPost.setConfig(requestConfig);//2.3 设置请求实体,封装了请求参数
HttpEntity requestEntity = MultipartEntityBuilder.create().addPart("media",new FileBody(file, ContentType.create("multipart/form-data", Consts.UTF_8), file.getName())).build();
httpPost.setEntity(requestEntity);try{
response= httpClient.execute(httpPost, newBasicHttpContext());if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" +response.getStatusLine().getStatusCode()+ ", url=" +url);return null;
}
HttpEntity entity=response.getEntity();if (entity != null) {
String resultStr= EntityUtils.toString(entity, "utf-8");
JSONObject result=JSON.parseObject(resultStr);//上传临时素材成功
if (result.getString("errcode")== null) {//成功//result.remove("errcode");//result.remove("errmsg");
returnresult;
}else{
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);int errCode = result.getInteger("errcode");
String errMsg= result.getString("errmsg");throw new Exception("error code:"+errCode+", error message:"+errMsg);
}
}
}catch(IOException e) {
System.out.println("request url=" + url + ", exception, msg=" +e.getMessage());
e.printStackTrace();
}finally{if (response != null) try{
response.close();//释放资源
}catch(IOException e) {
e.printStackTrace();
}
}return null;
}/*** @desc : 4.下载文件 -get
*
*@paramurl 请求url
*@paramfileDir 下载路径
*@return*@throwsException File*/
public static File downloadMedia(String url, String fileDir) throwsException {//1.生成一个请求
HttpGet httpGet = newHttpGet(url);//2.配置请求属性
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build();
httpGet.setConfig(requestConfig);//3.发起请求,获取响应信息//3.1 创建httpClient
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse response= null;//4.设置本地保存的文件//File file = new File(fileDir);
File file = null;try{//5. 发起请求,获取响应信息
response = httpClient.execute(httpGet, newBasicHttpContext());
System.out.println("HttpStatus.SC_OK:"+HttpStatus.SC_OK);
System.out.println("response.getStatusLine().getStatusCode():"+response.getStatusLine().getStatusCode());
System.out.println("http-header:"+JSON.toJSONString( response.getAllHeaders() ));
System.out.println("http-filename:"+getFileName(response) );//请求成功
if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){//6.取得请求内容
HttpEntity entity =response.getEntity();if (entity != null) {//这里可以得到文件的类型 如image/jpg /zip /tiff 等等 但是发现并不是十分有效,有时明明后缀是.rar但是取到的是null,这点特别说明
System.out.println(entity.getContentType());//可以判断是否是文件数据流
System.out.println(entity.isStreaming());//6.1 输出流//6.1.1获取文件名,拼接文件路径
String fileName=getFileName(response);
fileDir=fileDir+fileName;
file= newFile(fileDir);//6.1.2根据文件路径获取输出流
FileOutputStream output = newFileOutputStream(file);//6.2 输入流:从钉钉服务器返回的文件流,得到网络资源并写入文件
InputStream input =entity.getContent();//6.3 将数据写入文件:将输入流中的数据写入到输出流
byte b[] = new byte[1024];int j = 0;while( (j = input.read(b))!=-1){
output.write(b,0,j);
}
output.flush();
output.close();
}if (entity != null) {
entity.consumeContent();
}
}
}catch(IOException e) {
System.out.println("request url=" + url + ", exception, msg=" +e.getMessage());
e.printStackTrace();
}finally{if (response != null) try{
response.close();//释放资源
}catch(IOException e) {
e.printStackTrace();
}
}returnfile;
}/*** @desc : 5.下载文件 - post
*
*@paramurl 请求url
*@paramdata post请求参数
*@paramfileDir 文件下载路径
*@return*@throwsException File*/
public static File downloadMedia(String url, Object data, String fileDir) throwsException {//1.生成一个请求
HttpPost httpPost = newHttpPost(url);//2.配置请求属性//2.1 设置请求超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build();
httpPost.setConfig(requestConfig);//2.2 设置数据传输格式-json
httpPost.addHeader("Content-Type", "application/json");//2.3 设置请求参数
StringEntity requestEntity = new StringEntity(JSON.toJSONString(data), "utf-8");
httpPost.setEntity(requestEntity);//3.发起请求,获取响应信息//3.1 创建httpClient
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse response= null;//4.设置本地保存的文件//File file = new File(fileDir);
File file = null;try{//5. 发起请求,获取响应信息
response = httpClient.execute(httpPost, newBasicHttpContext());
System.out.println("HttpStatus.SC_OK:"+HttpStatus.SC_OK);
System.out.println("response.getStatusLine().getStatusCode():"+response.getStatusLine().getStatusCode());
System.out.println("http-header:"+JSON.toJSONString( response.getAllHeaders() ));
System.out.println("http-filename:"+getFileName(response) );//请求成功
if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){//6.取得请求内容
HttpEntity entity =response.getEntity();if (entity != null) {//这里可以得到文件的类型 如image/jpg /zip /tiff 等等 但是发现并不是十分有效,有时明明后缀是.rar但是取到的是null,这点特别说明
System.out.println(entity.getContentType());//可以判断是否是文件数据流
System.out.println(entity.isStreaming());//6.1 输出流//6.1.1获取文件名,拼接文件路径
String fileName=getFileName(response);
fileDir=fileDir+fileName;
file= newFile(fileDir);//6.1.2根据文件路径获取输出流
FileOutputStream output = newFileOutputStream(file);//6.2 输入流:从钉钉服务器返回的文件流,得到网络资源并写入文件
InputStream input =entity.getContent();//6.3 将数据写入文件:将输入流中的数据写入到输出流
byte b[] = new byte[1024];int j = 0;while( (j = input.read(b))!=-1){
output.write(b,0,j);
}
output.flush();
output.close();
}if (entity != null) {
entity.consumeContent();
}
}
}catch(IOException e) {
System.out.println("request url=" + url + ", exception, msg=" +e.getMessage());
e.printStackTrace();
}finally{if (response != null) try{
response.close();//释放资源
}catch(IOException e) {
e.printStackTrace();
}
}returnfile;
}/**5. 获取response header中Content-Disposition中的filename值
* @desc :
*
*@paramresponse 响应
*@returnString*/
public staticString getFileName(HttpResponse response) {
Header contentHeader= response.getFirstHeader("Content-Disposition");
String filename= null;if (contentHeader != null) {
HeaderElement[] values=contentHeader.getElements();if (values.length == 1) {
NameValuePair param= values[0].getParameterByName("filename");if (param != null) {try{//filename = new String(param.getValue().toString().getBytes(), "utf-8");//filename=URLDecoder.decode(param.getValue(),"utf-8");
filename =param.getValue();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}returnfilename;
}
}