package com.ceshi.util;
import com.alibaba.fastjson.JSONArray;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.zip.GZIPInputStream;public classWebResourceReader {private static final Logger log = LoggerFactory.getLogger(WebResourceReader.class);protected static final Logger STDERR = LoggerFactory.getLogger("STDERR");private static String encoding = "gbk";private staticString getHost(String url){
String regexp= "(http://)?([^/]*)(/?.*)";return url.replaceAll(regexp, "$2");
}private staticString getPath(String url){return url.replaceAll("http://"+getHost(url), "");
}public staticString read(String url) {
StringBuffer buffer= newStringBuffer();
BufferedReaderin = null;
GZIPInputStream gzin= null;
GetMethod getMethod= null;try{
PostUrl pu= newPostUrl();
pu.setHost(getHost(url));
pu.setPath(getPath(url));
pu.setPort(80);//创建GET方法的实例
getMethod = HttpClientUtil.getInstance().get(pu);//使用系统提供的默认的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,newDefaultHttpMethodRetryHandler());//执行getMethod
int statusCode =getMethod.getStatusCode();if (statusCode !=HttpStatus.SC_OK) {
log.error("读取远程资源文件失败:"+url);
}
InputStreamis =getMethod.getResponseBodyAsStream();
String contEncoding="";
Header head=getMethod.getResponseHeader("Content-Encoding");if(null!=head){
contEncoding=head.getValue();
}/**
* 如果文件使用GZIP压缩,则用GZIP流进行处理*/
if(StringUtils.isNotBlank(contEncoding)&& contEncoding.contains("gzip")) {//读取内容
gzin = new GZIPInputStream(is);in = new BufferedReader(newInputStreamReader(gzin, encoding));
}else{in = new BufferedReader(new InputStreamReader(is, encoding));
}
String inputLine;while ((inputLine = in.readLine()) != null) {
buffer.append(inputLine);
}
}catch(Exception e) {
log.error("##read error=",e);
}finally{//释放连接
if(getMethod!=null){
getMethod.releaseConnection();
}try{if(in!=null)in.close();
}catch(IOException e) {
log.error("Read remote file exception :",e);
}
}returnbuffer.toString();
}/**
* HttpClientUtil get方法
* @param url
* @return
* @throws Exception*/
public staticString getHttpResponse(String url) throws Exception{
BufferedReaderin = null;
InputStreamis = null;
GetMethod getMethod= null;try{
PostUrl pu= newPostUrl();
pu.setHost(getHost(url));
pu.setPath(getPath(url));
pu.setPort(80);
getMethod= HttpClientUtil.getInstance().get(pu);
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,newDefaultHttpMethodRetryHandler());int statusCode =getMethod.getStatusCode();
log.info("##getHttpResponse-url="+url+"|http-status="+statusCode);is =getMethod.getResponseBodyAsStream();
StringBuffer buffer= newStringBuffer();in = new BufferedReader(new InputStreamReader(is, "utf-8"));
String inputLine;while ((inputLine = in.readLine()) != null) {
buffer.append(inputLine);
}returnbuffer.toString();
}catch(Exception e) {
STDERR.error("##getHttpResponse error=",e);throwe;
}finally{try{if(is!=null)is.close();if(in!=null)in.close();if(getMethod!=null)
getMethod.releaseConnection();
}catch(IOException e) {
e.printStackTrace();
}
}
}/**
* HttpURLConnection Post方法
* @param url
* @param param
* @return
* @throws Exception*/
public staticString doPost(String url, String param) throws Exception {
URL url1= null;
BufferedReader reader= null;
PrintWriter writer= null;
HttpURLConnection conn= null;try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("POST");
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)");
conn.setDoInput(true);
conn.setDoOutput(true);
writer= newPrintWriter(conn.getOutputStream());
writer.print(param);
writer.flush();int resCode =conn.getResponseCode();
log.info("##doPost……url="+url+",param="+param+", Response code is" +resCode);if(resCode==200)
{
reader= new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}return "";
}catch(IOException e) {
STDERR.error("##HTTP Request is error,url="+url+",param="+param+", error=",e);throwe;
}finally{if (reader != null) {try{
reader.close();
}catch(IOException e1) {
STDERR.error("##doPost error1:",e1);
}
}if (writer != null) {try{
writer.close();
}catch(Exception e) {
STDERR.error("##doPost error2:",e);
}
}if (conn != null)try{
conn.disconnect();
}catch(Exception e) {
STDERR.error("##doPost error3:",e);
}
}
}/**
* headers的value暂时支持1个参数
* @param url
* @param param
* @param headers
* @return*/
public staticString doPost(String url, String param, HttpHeaders headers) throws Exception {
Iterator iterator=headers.entrySet().iterator();
HashMap map = new HashMap();while(iterator.hasNext()) {
HttpHeaders.Entry entry=(HttpHeaders.Entry) iterator.next();
Object key=entry.getKey();
Object vals=entry.getValue();if(vals instanceof LinkedList) {
String val= (String) ((LinkedList) vals).get(0);if (val instanceof String &&org.apache.commons.lang3.StringUtils.isNotBlank(val)) {
map.put(key, val);
}
}
}returndoPost(url, param, map);
}/**
* HttpURLConnection Post方法,待测
* @param url
* @param param
* @return
* @throws Exception*/
public staticString doPost(String url, String param, Map headers) throws Exception {
URL url1= null;
BufferedReader reader= null;
DataOutputStream writer= null;
GZIPInputStream gzin= null;
HttpURLConnection conn= null;
BufferedReader input= null;
String encodeCharset= "UTF-8";try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("POST");
conn.setInstanceFollowRedirects(true);
Iterator iterator=headers.entrySet().iterator();while(iterator.hasNext()) {
Map.Entry entry=(Map.Entry) iterator.next();
Object key=entry.getKey();
Object val=entry.getValue();if (key instanceof String &&val instanceof String)
conn.setRequestProperty((String) key, (String) val);
}
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("contentType", "UTF-8");
conn.setDoInput(true);
conn.setDoOutput(true);
writer= newDataOutputStream(conn.getOutputStream());
writer.write(param.getBytes());
writer.flush();
writer.close();int resCode =conn.getResponseCode();
log.info("##doPost_header_url=" + url + ",param=" + param + ", Response code is" +resCode);if (resCode == 200) {
String acceptEncoding= conn.getRequestProperty("accept-encoding");/**
* 如果文件使用GZIP压缩,则用GZIP流进行处理*/
if(StringUtils.isNotBlank(acceptEncoding)&& acceptEncoding.contains("gzip")) {//读取内容
gzin = newGZIPInputStream(conn.getInputStream());
input= new BufferedReader(newInputStreamReader(gzin,encodeCharset));
}else{
input= new BufferedReader(newInputStreamReader(conn.getInputStream(),encodeCharset));
}
String result= "";
String str;while (null != (str =input.readLine())) {
result+=str;
}returnresult;
}return "";
}catch(Exception e) {
e.printStackTrace();
STDERR.error("##HTTP Request is error,url=" + url + ",param=" + param + ", error=", e);throwe;
}finally{if (reader != null) {try{
reader.close();
}catch(IOException e1) {
STDERR.error("##doPost error1:", e1);
}
}if (writer != null) {try{
writer.close();
}catch(Exception e) {
STDERR.error("##doPost error2:", e);
}
}if (conn != null)try{
conn.disconnect();
}catch(Exception e) {
STDERR.error("##doPost error3:", e);
}
}
}/**
* HttpURLConnection get方法
* @param url
* @return*/
public staticString doGet(String url) {
URL url1= null;
BufferedReader reader= null;
HttpURLConnection conn= null;try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("GET");
conn.setInstanceFollowRedirects(true);
conn.connect();if (conn.getResponseCode()== 200)
{
reader= new BufferedReader(newInputStreamReader(conn.getInputStream()));
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}return "";
}catch(IOException e) {
STDERR.error("##doGet error,url="+url+", error=",e);throw newRuntimeException(e.getMessage(),e);
}finally{try{if(reader!=null)reader.close();if(conn!=null)conn.disconnect();
}catch(Exception e) {
STDERR.error("##doGet finally error,url="+url+", error=",e);
e.printStackTrace();
}
}
}/**
* HttpURLConnection PUT方法
* @param url
* @return*/
public static String doPUT(String url,Mapheaders) {
URL url1= null;
BufferedReader reader= null;
HttpURLConnection conn= null;try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("PUT");if (headers != null && headers.size() > 0) {for (Map.Entryentry : headers.entrySet()) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getOutputStream().flush();
conn.getOutputStream().close();
conn.connect();int code =conn.getResponseCode();if (code == 200) {
reader= new BufferedReader(newInputStreamReader(conn.getInputStream()));
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}
log.info("##doPut code" +code);return "";
}catch(IOException e) {
STDERR.error("##doPut error,url="+url+", error=",e);throw newRuntimeException(e.getMessage(),e);
}finally{try{if(reader!=null)reader.close();if(conn!=null)conn.disconnect();
}catch(Exception e) {
STDERR.error("##doPut error1,url="+url+", error=",e);
}
}
}/**
* HttpURLConnection get方法
* @param url
* @return*/
public staticString doGet(String url, String userAgent, Boolean useUserAgent,String clientIp) {
URL url1= null;
BufferedReader reader= null;
HttpURLConnection conn= null;try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("GET");
conn.setInstanceFollowRedirects(true);if(useUserAgent) {
conn.addRequestProperty("User-Agent", userAgent);
}if(StringUtils.isNotBlank(clientIp)){
conn.addRequestProperty("j-forwarded-for",clientIp);
conn.addRequestProperty("x-forwarded-for",clientIp);
}
conn.connect();if (conn.getResponseCode()== 200)
{
reader= new BufferedReader(newInputStreamReader(conn.getInputStream()));
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}return "";
}catch(IOException e) {
STDERR.error("##doGet error,url="+url+", error=",e);throw newRuntimeException(e.getMessage(),e);
}finally{try{if(reader!=null)reader.close();if(conn!=null)conn.disconnect();
}catch(Exception e) {
STDERR.error("##doGet finally error,url="+url+", error=",e);
e.printStackTrace();
}
}
}/**
* HttpURLConnection get方法
* @param url
* @return*/
public staticString doGet(String url,String charset) {
URL url1= null;
BufferedReader reader= null;
HttpURLConnection conn= null;if(StringUtils.isBlank(charset)){
charset="utf-8";
}try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("GET");
conn.setInstanceFollowRedirects(true);
conn.connect();if (conn.getResponseCode()== 200)
{
reader= new BufferedReader(newInputStreamReader(conn.getInputStream(),charset));
StringBuilder sb= newStringBuilder();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}return "";
}catch(IOException e) {
STDERR.error("##doGet error,url="+url+", error=",e);throw newRuntimeException(e.getMessage(),e);
}finally{try{if(reader!=null)reader.close();if(conn!=null)conn.disconnect();
}catch(Exception e) {
STDERR.error("##doGet finally error,url="+url+", error=",e);
e.printStackTrace();
}
}
}/**
* HttpURLConnection Post方法获取请求
* @param url
* @param param
* @return*/
public static MapdoPostForLive(String url, String param){
URL url1= null;
BufferedReader reader= null;
PrintWriter writer= null;
HttpURLConnection connection= null;
Map map = new HashMap();try{
url1= newURL(url);
connection=(HttpURLConnection) url1.openConnection();
connection.setConnectTimeout(20000);
connection.setReadTimeout(20000);
connection.setRequestMethod("POST");
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)");
connection.setDoInput(true);
connection.setDoOutput(true);
writer= newPrintWriter(connection.getOutputStream());
writer.print(param);
writer.flush();int resCode =connection.getResponseCode();
map.put("rescode", resCode);
log.info("##doPostForLive……url="+url+",param="+param+", Response code is" +resCode);if(resCode!=HttpStatus.SC_OK){
reader= new BufferedReader(newInputStreamReader(connection.getErrorStream()));
}else{
reader= new BufferedReader(newInputStreamReader(connection.getInputStream()));
}
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
map.put("resmess", sb.toString());
}catch(Exception e) {
STDERR.error("##doPostForLive Request is error,url="+url+",param="+param+", error=",e);
}finally{if (reader != null) {try{
reader.close();
}catch(IOException e1) {
STDERR.error("##doPostForLive error1:",e1);
}
}if (writer != null) {try{
writer.close();
}catch(Exception e) {
STDERR.error("##doPostForLive error2:",e);
}
}if (connection != null)try{
connection.disconnect();
}catch(Exception e) {
STDERR.error("##doPostForLive error3:",e);
}
}returnmap;
}/**
* HttpURLConnection Get方法获取请求
* @param url
* @return*/
public static MapdoGetForLive(String url){
URL url1= null;
BufferedReader reader= null;
HttpURLConnection connection= null;
Map map = new HashMap();try{
url1= newURL(url);
connection=(HttpURLConnection) url1.openConnection();
connection.setConnectTimeout(20000);//设置连接主机超时(单位:毫秒)
connection.setReadTimeout(20000);//设置从主机读取数据超时(单位:毫秒)
connection.setRequestMethod("GET");
connection.setInstanceFollowRedirects(true);
connection.connect();int resCode =connection.getResponseCode();
log.info("##doGetLive……url="+url+", Response code is" +resCode);
map.put("rescode", resCode);if(resCode!=HttpStatus.SC_OK){
reader= new BufferedReader(new InputStreamReader(connection.getErrorStream(),"UTF-8"));
}else{
reader= new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
}
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
map.put("resmess", sb.toString());
}catch(Exception e) {
STDERR.error("##doGetLive Request is error,url="+url+", error=",e);
}finally{if (reader != null) {try{
reader.close();
}catch(IOException e1) {
STDERR.error("##doGetLive error1:",e1);
}
}if (connection != null)try{
connection.disconnect();
}catch(Exception e) {
STDERR.error("##doGetLive error3:",e);
}
}returnmap;
}/**
* 抽奖
* @param url
* @param param
* @return
* @throws Exception*/
public staticString doPostForLottery(String url, String param) throws Exception {
URL url1= null;
BufferedReader reader= null;
PrintWriter writer= null;
HttpURLConnection connection= null;try{
url1= newURL(url);
connection=(HttpURLConnection) url1.openConnection();
connection.setConnectTimeout(20000);
connection.setReadTimeout(20000);
connection.setRequestMethod("POST");
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)");
connection.setRequestProperty("referer", "http://live.jd.com");
connection.setDoInput(true);
connection.setDoOutput(true);
writer= newPrintWriter(connection.getOutputStream());
writer.print(param);
writer.flush();int resCode =connection.getResponseCode();
log.info("##doPostForLottery……url="+url+",param="+param+", Response code is" +resCode);if(resCode==200)
{
reader= new BufferedReader(newInputStreamReader(connection.getInputStream()));
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}return "";
}catch(IOException e) {
STDERR.error("##doPostForLottery HTTP Request is error,url="+url+",param="+param+", error=",e);throwe;
}finally{if (reader != null) {try{
reader.close();
}catch(IOException e1) {
STDERR.error("##doPostForLottery error1:",e1);
}
}if (writer != null) {try{
writer.close();
}catch(Exception e) {
STDERR.error("##doPostForLottery error2:",e);
}
}if (connection != null)try{
connection.disconnect();
}catch(Exception e) {
STDERR.error("##doPostForLottery error3:",e);
}
}
}/**
* 获取外部数据 try3次
*
* @param url
* @return*/
public staticString getDataTry(String url, String param, String type) {if(StringUtils.isBlank(url)) {return null;
}
log.info("##getDataTry----url=" + url + "|param=" + param + "|type="+type);
String data=StringUtils.EMPTY;//失败尝试3次
int try_num = 3;for (int retryTime = 1; retryTime <= try_num; retryTime++) {try{if (StringUtils.isNotBlank(type) && "POST".equals(type)) {
data=WebResourceReader.doPost(url, param);
}else if (StringUtils.isNotBlank(type) && "GET".equals(type)) {
data=WebResourceReader.doGet(url);
}break;
}catch(Exception e) {if (retryTime ==try_num) {
STDERR.error("##getDataTry...url" + url + "|try" +try_num+ "次 fail |param=" + param + "|type=" +type+ "|error=", e);}else{
log.info("##getDataTry...url=" + url + "|try="
+retryTime);continue;
}
}
}
log.info("##getDataTry...url=" + url + "|param=" + param + "|type="
+ type + "|data=" +data);returndata;
}/**
* HttpURLConnection Post方法 参数json格式
* @param url
* @param param
* @return
* @throws Exception*/
public staticString doPostJson(String url, String param) throws Exception {
URL url1= null;
BufferedReader reader= null;
PrintWriter writer= null;
HttpURLConnection conn= null;try{
url1= newURL(url);
conn=(HttpURLConnection) url1.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setRequestMethod("POST");
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)");
conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
conn.setDoInput(true);
conn.setDoOutput(true);
writer= newPrintWriter(conn.getOutputStream());
writer.print(param);
writer.flush();int resCode =conn.getResponseCode();
log.info("##doPost……url="+url+",param="+param+", Response code is" +resCode);if(resCode==200)
{
reader= new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
StringBuffer sb= newStringBuffer();
String line;while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}returnsb.toString();
}return "";
}catch(IOException e) {
STDERR.error("##HTTP Request is error,url="+url+",param="+param+", error=",e);throwe;
}finally{if (reader != null) {try{
reader.close();
}catch(IOException e1) {
STDERR.error("##doPost error1:",e1);
}
}if (writer != null) {try{
writer.close();
}catch(Exception e) {
STDERR.error("##doPost error2:",e);
}
}if (conn != null)try{
conn.disconnect();
}catch(Exception e) {
STDERR.error("##doPost error3:",e);
}
}
}
}