package com.mlongbo.jfinal.common.httpclient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Vector;
/**
* HTTP请求对象
* <br></br>
* 默认使用utf-8编码
*
* @author malongbo
*/
public class HttpRequester {
private String defaultContentEncoding;
private static final String METHOD_GET = "GET";
private static final String METHOD_POST = "POST";
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_PUT = "PUT";
public HttpRequester() {
this.defaultContentEncoding = Charset.defaultCharset().name();
}
/**
* 发送GET请求
*
* @param urlString
* URL地址
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendGet(String urlString) throws IOException {
return this.send(urlString, METHOD_GET, null, null);
}
/**
* 发送GET请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendGet(String urlString, Map<String, Object> params)
throws IOException {
return this.send(urlString, METHOD_GET, params, null);
}
/**
* 发送GET请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @param propertys
* 请求属性
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendGet(String urlString, Map<String, Object> params,
Map<String, String> propertys) throws IOException {
return this.send(urlString, METHOD_GET, params, propertys);
}
/**
* 发送POST请求
*
* @param urlString
* URL地址
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendPost(String urlString) throws IOException {
return this.send(urlString, METHOD_POST, null, null);
}
/**
* 发送POST请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendPost(String urlString, Map<String, Object> params)
throws IOException {
return this.send(urlString, METHOD_POST, params, null);
}
/**
* 发送POST请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @param propertys
* 请求属性
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendPost(String urlString, Map<String, Object> params,
Map<String, String> propertys) throws IOException {
return this.send(urlString, METHOD_POST, params, propertys);
}
/**
* 发送DELETE请求
*
* @param urlString
* URL地址
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendDelete(String urlString) throws IOException {
return this.send(urlString, METHOD_DELETE, null, null);
}
/**
* 发送DELETE请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendDelete(String urlString, Map<String, Object> params)
throws IOException {
return this.send(urlString, METHOD_DELETE, params, null);
}
/**
* 发送DELETE请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @param propertys
* 请求属性
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendDelete(String urlString, Map<String, Object> params,
Map<String, String> propertys) throws IOException {
return this.send(urlString, METHOD_DELETE, params, propertys);
}
/**
* 发送PUT请求
*
* @param urlString
* URL地址
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendPut(String urlString) throws IOException {
return this.send(urlString, METHOD_PUT, null, null);
}
/**
* 发送PUT请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendPut(String urlString, Map<String, Object> params)
throws IOException {
return this.send(urlString, METHOD_PUT, params, null);
}
/**
* 发送PUT请求
*
* @param urlString
* URL地址
* @param params
* 参数集合
* @param propertys
* 请求属性
* @return 响应对象
* @throws java.io.IOException
*/
public HttpResponse sendPut(String urlString, Map<String, Object> params,
Map<String, String> propertys) throws IOException {
return this.send(urlString, METHOD_PUT, params, propertys);
}
/**
* 拼接一个参数多个值情况
* @param key
* @param values
* @return
*/
private String concatParams(String key, Object[] values) {
StringBuffer buffer = new StringBuffer();
int i = 0;
for (Object value: values) {
if (i != 0)
buffer.append("&");
buffer.append(key).append("=").append(value);
i++;
}
return buffer.toString();
}
/**
* 发送HTTP请求
*
* @param urlString
* @return 响映对象
* @throws java.io.IOException
*/
private HttpResponse send(String urlString, String method,
Map<String, Object> parameters, Map<String, String> propertys)
throws IOException {
HttpURLConnection urlConnection = null;
/*
GET、DELETE和PUT函数,使用此参数拼接形式
*/
if ((method.equalsIgnoreCase(METHOD_GET) || method.equalsIgnoreCase(METHOD_DELETE)
|| method.equalsIgnoreCase(METHOD_PUT)) && parameters != null) {
StringBuffer param = new StringBuffer();
int i = 0;
for (String key : parameters.keySet()) {
if (i == 0)
param.append("?");
else
param.append("&");
Object value = parameters.get(key);
if (value == null) continue;
//如果是数据,说明需要拼接一个参数多个值
if (value.getClass().isArray())
param.append(concatParams(key, (Object[]) value));
else
param.append(key).append("=").append(value);
i++;
}
urlString += param.toString();
}
URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod(method);
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setUseCaches(false);
if (propertys != null)
for (String key : propertys.keySet()) {
urlConnection.addRequestProperty(key, propertys.get(key));
}
/*
POST情况方式使用此参数拼接
*/
if (method.equalsIgnoreCase(METHOD_POST) && parameters != null) {
StringBuffer param = new StringBuffer();
for (String key : parameters.keySet()) {
param.append("&");
Object value = parameters.get(key);
if (value == null) continue;
//如果是数据,说明需要拼接一个参数多个值
if (value.getClass().isArray())
param.append(concatParams(key, (Object[]) value));
else
param.append(key).append("=").append(value);
}
urlConnection.getOutputStream().write(param.toString().getBytes());
urlConnection.getOutputStream().flush();
urlConnection.getOutputStream().close();
}
//处理响应
return this.makeContent(urlString, urlConnection);
}
/**
* 处理响应
*
* @param urlConnection
* @return 响应对象
* @throws java.io.IOException
*/
private HttpResponse makeContent(String urlString,
HttpURLConnection urlConnection) throws IOException {
HttpResponse httpResponser = new HttpResponse();
try {
InputStream in = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(in));
httpResponser.contentCollection = new Vector<String>();
StringBuffer temp = new StringBuffer();
String line = bufferedReader.readLine();
while (line != null) {
httpResponser.contentCollection.add(line);
temp.append(line).append("\r\n");
line = bufferedReader.readLine();
}
bufferedReader.close();
String ecod = urlConnection.getContentEncoding();
if (ecod == null)
ecod = this.defaultContentEncoding;
httpResponser.urlString = urlString;
httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();
httpResponser.file = urlConnection.getURL().getFile();
httpResponser.host = urlConnection.getURL().getHost();
httpResponser.path = urlConnection.getURL().getPath();
httpResponser.port = urlConnection.getURL().getPort();
httpResponser.protocol = urlConnection.getURL().getProtocol();
httpResponser.query = urlConnection.getURL().getQuery();
httpResponser.ref = urlConnection.getURL().getRef();
httpResponser.userInfo = urlConnection.getURL().getUserInfo();
httpResponser.content = new String(temp.toString().getBytes(), ecod);
httpResponser.contentEncoding = ecod;
httpResponser.code = urlConnection.getResponseCode();
httpResponser.message = urlConnection.getResponseMessage();
httpResponser.contentType = urlConnection.getContentType();
httpResponser.method = urlConnection.getRequestMethod();
httpResponser.connectTimeout = urlConnection.getConnectTimeout();
httpResponser.readTimeout = urlConnection.getReadTimeout();
return httpResponser;
} catch (IOException e) {
throw e;
} finally {
if (urlConnection != null)
urlConnection.disconnect();
}
}
/**
* 默认的响应字符集
*/
public String getDefaultContentEncoding() {
return this.defaultContentEncoding;
}
/**
* 设置默认的响应字符集
*/
public void setDefaultContentEncoding(String defaultContentEncoding) {
this.defaultContentEncoding = defaultContentEncoding;
}
}