基于 JDK提供的java.net package实现简易HttpClient,能够发送get和post请求。
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.IOUtils;
/**
* 类描述:简易Http客户端
*
* @author ruipeng.lrp
* @since 2017/11/2
**/
public class HttpSimpleClient {
// 超时时间:连接超时和读超时
private static final int DEFAULT_TIMEOUT = 3000;
/**
* 功能:发送GET请求。
*
* @param url
* @param headers
* 请求Header,可以为null
* @param paramValues
* 参数,可以为null
* @param encoding
* URL编码使用的字符集
* @return
* @throws IOException
*/
static public HttpResult httpGet(String url, List<String> headers, List<String> paramValues, String encoding)
throws IOException {
String encodedContent = encodingParams(paramValues, encoding);
url += (null == encodedContent) ? "" : ("?" + encodedContent);
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(DEFAULT_TIMEOUT);
conn.setReadTimeout(DEFAULT_TIMEOUT);
setHeaders(conn, headers, encoding);
conn.connect();
int respCode = conn.getResponseCode();
String resp = null;
if (HttpURLConnection.HTTP_OK == respCode) {
//将InputStream转换为String
resp = IOUtils.toString(conn.getInputStream(), Charset.forName(encoding));
} else {
resp = IOUtils.toString(conn.getErrorStream(), Charset.forName(encoding));
}
return new HttpResult(respCode, resp);
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
/**
* 功能:发送POST请求。
*
* @param url
* @param headers 请求Header,可以为null
* @param paramValues 参数,可以为null
* @param encoding URL编码使用的字符集
* @return
* @throws IOException
*/
static public HttpResult httpPost(String url, List<String> headers, List<String> paramValues, String encoding)
throws IOException {
String encodedContent = encodingParams(paramValues, encoding);
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(DEFAULT_TIMEOUT);
conn.setReadTimeout(DEFAULT_TIMEOUT);
conn.setDoOutput(true);
conn.setDoInput(true);
setHeaders(conn, headers, encoding);
conn.getOutputStream().write(encodedContent.getBytes());
int respCode = conn.getResponseCode();
String resp = null;
if (HttpURLConnection.HTTP_OK == respCode) {
resp = IOUtils.toString(conn.getInputStream(), Charset.forName(encoding));
} else {
resp = IOUtils.toString(conn.getErrorStream(), Charset.forName(encoding));
}
return new HttpResult(respCode, resp);
} finally {
if (null != conn) {
conn.disconnect();
}
}
}
static private void setHeaders(HttpURLConnection conn, List<String> headers, String encoding) {
if (null != headers) {
for (Iterator<String> iter = headers.iterator(); iter.hasNext();) {
conn.addRequestProperty(iter.next(), iter.next());
}
}
conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding);
}
static private String encodingParams(List<String> paramValues, String encoding)
throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
if (null == paramValues) {
return null;
}
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext();) {
sb.append(iter.next()).append("=");
sb.append(URLEncoder.encode(iter.next(), encoding));
if (iter.hasNext()) {
sb.append("&");
}
}
return sb.toString();
}
static public class HttpResult {
final public int code;
final public String content;
public HttpResult(int code, String content) {
this.code = code;
this.content = content;
}
}
}