package cn.zytx.common.http;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
public class HttpUtil {
public static final int CONNECT_TIMEOUT = 15000;
public static final int READ_TIMEOUT = 15000;
public static final String POST_MEGHOD = "POST";
public static final String GET_MEGHOD = "GET";
private static final String FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8";
private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
public static String getHttp(String actionName) throws Exception{
return getHttp(actionName,null,null);
}
/**
* HTTP GET
* @param actionName URL,可以帶參數
* @param params 參數列表,可以为 null
* @return
* @throws Exception
*/
public static String getHttp(String actionName, Map<String, String> params) throws Exception{
return getHttp(actionName,params,null);
}
/**
* HTTP GET
* @param actionName URL,可以帶參數
* @param params 參數列表,可以为 null
* @param headers HTTP header 可以为 null
* @return
* @throws Exception
*/
public static String getHttp(String actionName, Map<String, String> params,Map<String,String> headers) throws Exception{
String paramString = contactMap(params);
String url = actionName;
if(!"".equals(paramString)) {
url = actionName.contains("?")
? actionName + "&" + paramString//如果包含?,則直接追加
: actionName + "?" + paramString;//不包含?,則用?追加
}
HttpURLConnection connect = (HttpURLConnection)new java.net.URL(url).openConnection();
setConnectProperty(connect, GET_MEGHOD,null,headers);
connect.connect();
return getReturnMsg(connect);
}
/**
* HTTP POST
* @param actionName
* @param params
* @return
* @throws IOException
*/
public static String postHttp(String actionName, Map<String, String> params) throws IOException {
return postHttp(actionName,params,null);
}
/**
* HTTP POST
* @param actionName
* @param params
* @param headers
* @return
* @throws IOException
*/
public static String postHttp(String actionName, Map<String, String> params,Map<String,String> headers) throws IOException {
HttpURLConnection connect = (HttpURLConnection)new java.net.URL(actionName).openConnection();
setConnectProperty(connect,POST_MEGHOD,FORM_URLENCODED,headers);
String paramString = contactMap(params);
writeContent(connect,paramString);
connect.connect();
return getReturnMsg(connect);
}
public static String postHttp(String actionName, String body, String contentType) throws Exception{
return postHttp(actionName,body,contentType,null);
}
/**
*
* @param actionName
* @param body
* @param contentType
* @param headers
* @return
* @throws Exception
*/
public static String postHttp(String actionName, String body, String contentType,Map<String,String> headers) throws Exception{
HttpURLConnection connect = (HttpURLConnection)new java.net.URL(actionName).openConnection();
setConnectProperty(connect,POST_MEGHOD,contentType, headers);
writeContent(connect,body);
connect.connect();
return getReturnMsg(connect);
}
public static String postHttps(String actionName, String body, String contentType) throws Exception{
return postHttps(actionName,body,contentType,null);
}
/**
* HTTPS POST (HttpsURLConnection)说明只要URL是https的,自动打开的就是https,所以其实不用postHttps相关方法
* @param actionName
* @param body
* @param contentType
* @param headers
* @return
* @throws Exception
*/
public static String postHttps(String actionName, String body, String contentType,Map<String,String> headers) throws Exception{
HttpsURLConnection connect = (HttpsURLConnection)new java.net.URL(actionName).openConnection();
setConnectProperty(connect,POST_MEGHOD, contentType,headers);
writeContent(connect,body);
connect.connect();
return getReturnMsg(connect);
}
/**
* key1=value1&key2=value2,如果value=null 或者 size=0 返回 ""
* @param value
* @return
* @throws UnsupportedEncodingException
*/
private static String contactMap(Map<String, String> value) throws UnsupportedEncodingException {
if(null == value){return "";}
String params = "";
Iterator<String> iterator = value.keySet().iterator();
while(iterator.hasNext()){
String key = iterator.next().toString();
params += key + "=" + URLEncoder.encode(value.get(key), "UTF8") + "&";
}
if(params.length() > 0){
params = params.substring(0, params.length() - 1);
}
return params;
}
private static void writeContent(HttpURLConnection connect, String data) throws IOException {
PrintWriter out = new PrintWriter(connect.getOutputStream());
out.print(data);
out.flush();
out.close();
}
private static void setConnectProperty(HttpURLConnection connect, String method, String contentType, Map<String,String> headers) throws ProtocolException {
connect.setRequestMethod(method);
connect.setDoOutput(true);
connect.setUseCaches(false);
if(null != contentType){
connect.setRequestProperty("Content-Type", contentType);
}
if(null != headers) {
headers.forEach((key, value) -> connect.setRequestProperty(key, value));
}
connect.setConnectTimeout(CONNECT_TIMEOUT);
connect.setReadTimeout(READ_TIMEOUT);
}
private static String getReturnMsg(HttpURLConnection connect) throws IOException {
if( HttpURLConnection.HTTP_OK == connect.getResponseCode()){
InputStream is = connect.getInputStream();
ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
int ch;
while((ch = is.read()) != -1){
bytestream.write(ch);
}
is.close();
connect.disconnect();
byte[] result = bytestream.toByteArray();
return new String(result);
} else{
String err = errMessage(connect);
logger.error(err);
throw new RuntimeException(connect.getResponseCode() + "");
}
}
private static String errMessage(HttpURLConnection connect) throws IOException {
//如果服务器返回的HTTP状态不是HTTP_OK,则表示发生了错误,此时可以通过如下方法了解错误原因。
InputStream is = connect.getErrorStream(); //通过getErrorStream了解错误的详情
InputStreamReader isr = new InputStreamReader(is,"utf-8");
BufferedReader in = new BufferedReader(isr);
String inputLine;
StringWriter bw = new StringWriter();
while ((inputLine = in.readLine()) != null)
{
bw.write(inputLine);
bw.write("\n");
}
bw.close();
in.close();
return bw.getBuffer().toString();
}
public static void main(String[] args) throws Exception{
String s = getHttp("https://www.hao123.com/");
System.out.println(s);
}
}
通用的HTTP请求类
猜你喜欢
转载自blog.csdn.net/xxssyyyyssxx/article/details/78552816
今日推荐
周排行