httpclient.java
package com.httpclint.util;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.http.HttpException;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.FileBody;
/**
* HTTP工具类,封装HttpClient4.3.x来对外提供简化的HTTP请求
* @author yangjian1004
* @Date Aug 5, 2014
*/
public class HttpClient {
private HttpProxy proxy;
/**
* 设置代理访问网络
* @param proxy
*/
public void setProxy(HttpProxy proxy) {
this.proxy = proxy;
}
/**
* 是否启用SSL模式
* @param enabled
*/
public void enableSSL(boolean enabled) {
HttpClientWrapper.enabledSSL(enabled);
}
/**
* 使用Get方式 根据URL地址,获取ResponseStatus对象
*
* @param url
* 完整的URL地址
* @return ResponseStatus 如果发生异常则返回null,否则返回ResponseStatus对象
* @throws IOException
* @throws HttpException
*/
public ResponseStatus get(String url) throws HttpException, IOException {
HttpClientWrapper hw = new HttpClientWrapper(proxy);
return hw.sendRequest(url);
}
/**
* 使用Get方式 根据URL地址,获取ResponseStatus对象
*
* @param url
* 完整的URL地址
* @param urlEncoding
* 编码,可以为null
* @return ResponseStatus 如果发生异常则返回null,否则返回ResponseStatus对象
*/
public ResponseStatus get(String url, String urlEncoding) {
HttpClientWrapper hw = new HttpClientWrapper(proxy);
ResponseStatus response = null;
try {
response = hw.sendRequest(url, urlEncoding);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 将参数拼装在url中,进行post请求。
*
* @param url
* @return
*/
public ResponseStatus post(String url) {
HttpClientWrapper hw = new HttpClientWrapper(proxy);
ResponseStatus ret = null;
try {
setParams(url, hw);
ret = hw.postNV(url);
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
private void setParams(String url, HttpClientWrapper hw) {
String[] paramStr = url.split("[?]", 2);
if (paramStr == null || paramStr.length != 2) {
return;
}
String[] paramArray = paramStr[1].split("[&]");
if (paramArray == null) {
return;
}
for (String param : paramArray) {
if (param == null || "".equals(param.trim())) {
continue;
}
String[] keyValue = param.split("[=]", 2);
if (keyValue == null || keyValue.length != 2) {
continue;
}
hw.addNV(keyValue[0], keyValue[1]);
}
}
/**
* 上传文件(包括图片)
*
* @param url
* 请求URL
* @param paramsMap
* 参数和值
* @return
*/
public ResponseStatus post(String url, Map<String, Object> paramsMap) {
HttpClientWrapper hw = new HttpClientWrapper(proxy);
ResponseStatus ret = null;
try {
setParams(url, hw);
Iterator<String> iterator = paramsMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Object value = paramsMap.get(key);
if (value instanceof File) {
FileBody fileBody = new FileBody((File) value);
hw.getContentBodies().add(fileBody);
} else if (value instanceof byte[]) {
byte[] byteVlue = (byte[]) value;
ByteArrayBody byteArrayBody = new ByteArrayBody(byteVlue, key);
hw.getContentBodies().add(byteArrayBody);
} else {
if (value != null && !"".equals(value)) {
hw.addNV(key, String.valueOf(value));
} else {
hw.addNV(key, "");
}
}
}
ret = hw.postEntity(url);
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
/**
* 使用post方式,发布对象转成的json给Rest服务。
*
* @param url
* @param jsonBody
* @return
*/
public ResponseStatus post(String url, String jsonBody) {
return post(url, jsonBody, "application/json");
}
/**
* 使用post方式,发布对象转成的xml给Rest服务
*
* @param url
* URL地址
* @param xmlBody
* xml文本字符串
* @return ResponseStatus 如果发生异常则返回空,否则返回ResponseStatus对象
*/
public ResponseStatus postXml(String url, String xmlBody) {
return post(url, xmlBody, "application/xml");
}
private ResponseStatus post(String url, String body, String contentType) {
HttpClientWrapper hw = new HttpClientWrapper(proxy);
ResponseStatus ret = null;
try {
hw.addNV("body", body);
ret = hw.postNV(url, contentType);
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
public static void main(String[] args) throws HttpException, IOException {
testGet();
//testUploadFile();
}
//test
public static void testGet() throws HttpException, IOException {
String url = "http://www.baidu.com/";
HttpClient c = new HttpClient();
ResponseStatus r = c.get(url);
System.out.println(r.getContent());
}
//test
public static void testUploadFile() {
try {
HttpClient c = new HttpClient();
String url = "http://localhost:8280/jfly/action/admin/user/upload.do";
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("userName", "jj");
paramsMap.put("password", "jj");
paramsMap.put("filePath", new File("C:\\Users\\yangjian1004\\Pictures\\default (1).jpeg"));
ResponseStatus ret = c.post(url, paramsMap);
System.out.println(ret.getContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.httpclint.util;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.CodingErrorAction;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpHost;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.config.MessageConstraints;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.CharsetUtils;
import org.apache.http.util.EntityUtils;
/**
* 封装HttpClient
* <p>
* @author yangjian1004
* @Date Aug 5, 2014
*/
public class HttpClientWrapper {
private enum HttpMethod {
GET, POST
}
private static CloseableHttpClient client;
private List<ContentBody> contentBodies;
private List<NameValuePair> nameValuePostBodies;
private static PoolingHttpClientConnectionManager connManager = null;
public static void enabledSSL(boolean enabled) {
if (enabled) {
try {
SSLContext sslContext = SSLContexts.custom().useTLS().build();
sslContext.init(null, new TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} }, null);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
.<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslContext)).build();
connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
connManager.setDefaultSocketConfig(socketConfig);
MessageConstraints messageConstraints = MessageConstraints.custom().setMaxHeaderCount(200)
.setMaxLineLength(2000).build();
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setMalformedInputAction(CodingErrorAction.IGNORE)
.setUnmappableInputAction(CodingErrorAction.IGNORE).setCharset(Consts.UTF_8)
.setMessageConstraints(messageConstraints).build();
connManager.setDefaultConnectionConfig(connectionConfig);
connManager.setMaxTotal(200);
connManager.setDefaultMaxPerRoute(20);
} catch (KeyManagementException e) {
} catch (NoSuchAlgorithmException e) {
}
}
}
public HttpClientWrapper(HttpProxy proxy) {
super();
//client = HttpClientBuilder.create().build();//不使用连接池
client = this.getCloseableHttpClient(proxy);
this.contentBodies = new ArrayList<ContentBody>();
this.nameValuePostBodies = new LinkedList<NameValuePair>();
}
private CloseableHttpClient getCloseableHttpClient(HttpProxy proxy) {
if (null != proxy) {
HttpHost proxyHost = new HttpHost(proxy.getHost(), proxy.getPort());
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
if (null != proxy.getUser() && null != proxy.getPassword()) {
credentialsProvider.setCredentials(new AuthScope(proxy.getHost(), proxy.getPort()),
new UsernamePasswordCredentials(proxy.getUser(), proxy.getPassword()));
}
return HttpClients.custom().setProxy(proxyHost).setDefaultCredentialsProvider(credentialsProvider).build();
} else {
return HttpClients.custom().setConnectionManager(connManager).build();
}
}
/**
* Get方式访问URL
*
* @param url
* @return
* @throws HttpException
* @throws IOException
*/
public ResponseStatus sendRequest(String url) throws HttpException, IOException {
return this.sendRequest(url, "UTF-8", HttpMethod.GET, null);
}
/**
* Get方式访问URL
*
* @param url
* @param urlEncoding
* @return
* @throws HttpException
* @throws IOException
*/
public ResponseStatus sendRequest(String url, String urlEncoding) throws HttpException, IOException {
return this.sendRequest(url, urlEncoding, HttpMethod.GET, null);
}
/**
* POST方式发送名值对请求URL
*
* @param url
* @return
* @throws HttpException
* @throws IOException
*/
public ResponseStatus postNV(String url) throws HttpException, IOException {
return this.sendRequest(url, "UTF-8", HttpMethod.POST, null);
}
public ResponseStatus postNV(String url, String contentType) throws HttpException, IOException {
return sendRequest(url, "UTF-8", HttpMethod.POST, contentType);
}
/**
* 根据url编码,请求方式,请求URL
*
* @param urlstr
* @param urlEncoding
* @param bodyType
* @return
* @throws HttpException
* @throws IOException
*/
public ResponseStatus sendRequest(String urlstr, String urlEncoding, HttpMethod bodyType, String contentType)
throws HttpException, IOException {
if (urlstr == null)
return null;
String url = urlstr;
if (urlEncoding != null)
url = HttpClientWrapper.encodeURL(url.trim(), urlEncoding);
HttpEntity entity = null;
HttpRequestBase request = null;
CloseableHttpResponse response = null;
try {
if (HttpMethod.GET == bodyType) {
request = new HttpGet(url);
} else if (HttpMethod.POST == bodyType) {
this.parseUrl(url);
HttpPost httpPost = new HttpPost(toUrl());
List<NameValuePair> nvBodyList = this.getNVBodies();
httpPost.setEntity(new UrlEncodedFormEntity(nvBodyList, urlEncoding));
request = httpPost;
}
if (contentType != null) {
request.addHeader(HttpHeaders.CONTENT_TYPE, contentType);
}
//setTimeOut(request, timeout);
request.addHeader(HttpHeaders.USER_AGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
response = client.execute(request);
entity = response.getEntity(); // 获取响应实体
StatusLine statusLine = response.getStatusLine();
ResponseStatus ret = new ResponseStatus();
ret.setStatusCode(statusLine.getStatusCode());
ret.setEncoding(urlEncoding);
getResponseStatus(entity, ret);
return ret;
} finally {
close(entity, request, response);
}
}
private void getResponseStatus(HttpEntity entity, ResponseStatus ret) throws IOException {
Header enHeader = entity.getContentEncoding();
if (enHeader != null) {
String charset = enHeader.getValue().toLowerCase();
ret.setEncoding(charset);
}
String contenttype = this.getResponseStatusType(entity);
ret.setContentType(contenttype);
ret.setContentTypeString(this.getResponseStatusTypeString(entity));
ret.setContentBytes(EntityUtils.toByteArray(entity));
}
public ResponseStatus postEntity(String url) throws HttpException, IOException {
return this.postEntity(url, "UTF-8");
}
/**
* POST方式发送名值对请求URL,上传文件(包括图片)
*
* @param url
* @return
* @throws HttpException
* @throws IOException
*/
public ResponseStatus postEntity(String url, String urlEncoding) throws HttpException, IOException {
if (url == null)
return null;
HttpEntity entity = null;
HttpRequestBase request = null;
CloseableHttpResponse response = null;
try {
this.parseUrl(url);
HttpPost httpPost = new HttpPost(toUrl());
//对请求的表单域进行填充
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
for (NameValuePair nameValuePair : this.getNVBodies()) {
entityBuilder.addPart(nameValuePair.getName(),
new StringBody(nameValuePair.getValue(), ContentType.create("text/plain", urlEncoding)));
}
for (ContentBody contentBody : getContentBodies()) {
entityBuilder.addPart("file", contentBody);
}
entityBuilder.setCharset(CharsetUtils.get(urlEncoding));
httpPost.setEntity(entityBuilder.build());
request = httpPost;
response = client.execute(request);
//响应状态
StatusLine statusLine = response.getStatusLine();
// 获取响应对象
entity = response.getEntity();
ResponseStatus ret = new ResponseStatus();
ret.setStatusCode(statusLine.getStatusCode());
getResponseStatus(entity, ret);
return ret;
} finally {
close(entity, request, response);
}
}
private void close(HttpEntity entity, HttpRequestBase request, CloseableHttpResponse response) throws IOException {
if (request != null)
request.releaseConnection();
if (entity != null)
entity.getContent().close();
if (response != null)
response.close();
}
public NameValuePair[] getNVBodyArray() {
List<NameValuePair> list = this.getNVBodies();
if (list == null || list.isEmpty())
return null;
NameValuePair[] nvps = new NameValuePair[list.size()];
Iterator<NameValuePair> it = list.iterator();
int count = 0;
while (it.hasNext()) {
NameValuePair nvp = it.next();
nvps[count++] = nvp;
}
return nvps;
}
public List<NameValuePair> getNVBodies() {
return Collections.unmodifiableList(this.nameValuePostBodies);
}
private String getResponseStatusType(HttpEntity method) {
Header contenttype = method.getContentType();
if (contenttype == null)
return null;
String ret = null;
try {
HeaderElement[] hes = contenttype.getElements();
if (hes != null && hes.length > 0) {
ret = hes[0].getName();
}
} catch (Exception e) {
}
return ret;
}
private String getResponseStatusTypeString(HttpEntity method) {
Header contenttype = method.getContentType();
if (contenttype == null)
return null;
return contenttype.getValue();
}
static Set<Character> BEING_ESCAPED_CHARS = new HashSet<Character>();
static {
char[] signArray = { ' ', '\\', '‘', ']', '!', '^', '#', '`', '$', '{', '%', '|', '}', '(', '+', ')', '<', '>',
';', '[' };
for (int i = 0; i < signArray.length; i++) {
BEING_ESCAPED_CHARS.add(new Character(signArray[i]));
}
}
public static String encodeURL(String url, String encoding) {
if (url == null)
return null;
if (encoding == null)
return url;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < url.length(); i++) {
char c = url.charAt(i);
if (c == 10) {
continue;
} else if (BEING_ESCAPED_CHARS.contains(new Character(c)) || c == 13 || c > 126) {
try {
sb.append(URLEncoder.encode(String.valueOf(c), encoding));
} catch (Exception e) {
sb.append(c);
}
} else {
sb.append(c);
}
}
return sb.toString().replaceAll("\\+", "%20");
}
private String protocol;
private String host;
private int port;
private String dir;
private String uri;
private final static int DefaultPort = 80;
private final static String ProtocolSeparator = "://";
private final static String PortSeparator = ":";
private final static String HostSeparator = "/";
private final static String DirSeparator = "/";
private void parseUrl(String url) {
this.protocol = null;
this.host = null;
this.port = DefaultPort;
this.dir = "/";
this.uri = dir;
if (url == null || url.length() == 0)
return;
String u = url.trim();
boolean MeetProtocol = false;
int pos = u.indexOf(ProtocolSeparator);
if (pos > 0) {
MeetProtocol = true;
this.protocol = u.substring(0, pos);
pos += ProtocolSeparator.length();
}
int posStartDir = 0;
if (MeetProtocol) {
int pos2 = u.indexOf(PortSeparator, pos);
if (pos2 > 0) {
this.host = u.substring(pos, pos2);
pos2 = pos2 + PortSeparator.length();
int pos3 = u.indexOf(HostSeparator, pos2);
String PortStr = null;
if (pos3 > 0) {
PortStr = u.substring(pos2, pos3);
posStartDir = pos3;
} else {
int pos4 = u.indexOf("?");
if (pos4 > 0) {
PortStr = u.substring(pos2, pos4);
posStartDir = -1;
} else {
PortStr = u.substring(pos2);
posStartDir = -1;
}
}
try {
this.port = Integer.parseInt(PortStr);
} catch (Exception e) {
}
} else {
pos2 = u.indexOf(HostSeparator, pos);
if (pos2 > 0) {
this.host = u.substring(pos, pos2);
posStartDir = pos2;
} else {
this.host = u.substring(pos);
posStartDir = -1;
}
}
pos = u.indexOf(HostSeparator, pos);
pos2 = u.indexOf("?");
if (pos > 0 && pos2 > 0) {
this.uri = u.substring(pos, pos2);
} else if (pos > 0 && pos2 < 0) {
this.uri = u.substring(pos);
}
}
if (posStartDir >= 0) {
int pos2 = u.lastIndexOf(DirSeparator, posStartDir);
if (pos2 > 0) {
this.dir = u.substring(posStartDir, pos2 + 1);
}
}
}
private String toUrl() {
StringBuffer ret = new StringBuffer();
if (this.protocol != null) {
ret.append(this.protocol);
ret.append(ProtocolSeparator);
if (this.host != null)
ret.append(this.host);
if (this.port != DefaultPort) {
ret.append(PortSeparator);
ret.append(this.port);
}
}
ret.append(this.uri);
return ret.toString();
}
public void addNV(String name, String value) {
BasicNameValuePair nvp = new BasicNameValuePair(name, value);
this.nameValuePostBodies.add(nvp);
}
public void clearNVBodies() {
this.nameValuePostBodies.clear();
}
public List<ContentBody> getContentBodies() {
return contentBodies;
}
}
package com.httpclint.util;
public class HttpProxy {
private String host;
private int port;
private String user;
private String password;
public HttpProxy(String ipAndPort) {
this.host = ipAndPort.split(":")[0];
this.port = Integer.parseInt(ipAndPort.split(":")[1]);
}
public HttpProxy(String host, int port) {
super();
this.host = host;
this.port = port;
}
public HttpProxy(String host, int port, String user, String password) {
super();
this.host = host;
this.port = port;
this.user = user;
this.password = password;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.httpclint.util;
import java.io.UnsupportedEncodingException;
/**
* 封装HttpClient返回数据
* <p>
* @author yangjian1004
* @Date Aug 5, 2014
*/
public class ResponseStatus {
private String encoding;
private byte[] contentBytes;
private int statusCode;
private String contentType;
private String contentTypeString;
public String getEncoding() {
return encoding;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public String getContentType() {
return this.contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getContentTypeString() {
return this.contentTypeString;
}
public void setContentTypeString(String contenttypeString) {
this.contentTypeString = contenttypeString;
}
public String getContent() throws UnsupportedEncodingException {
return this.getContent(this.encoding);
}
public String getContent(String encoding) throws UnsupportedEncodingException {
if (encoding == null) {
return new String(contentBytes);
}
return new String(contentBytes, encoding);
}
public String getUTFContent() throws UnsupportedEncodingException {
return this.getContent("UTF-8");
}
public byte[] getContentBytes() {
return contentBytes;
}
public void setContentBytes(byte[] contentBytes) {
this.contentBytes = contentBytes;
}
public int getStatusCode() {
return statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
}
http://download.csdn.net/detail/jelly_8090/7923537