基于 Httpclient 的封装 HttpClientUtil

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketTimeoutException;
import java.nio.charset.Charset;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.cookie.Cookie;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 
 * @author hp
 * 通过httpclient 请求地址页面
 *
 */
public class HttpClientUtil{
	private static final String osName = System.getProperty("os.name").toLowerCase();
	private static final String DEFAULT_WINDOWS_REQUESTER_HEADER_USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8";
	private static final String DEFAULT_LINUX_REQUESTER_HEADER_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17";
	private static final Logger logger=LoggerFactory.getLogger(HttpClientUtil.class);
	private static final RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();// 设置请求和传输超时时间
	private RequestBuilder requestBuilder=null;
	private Charset charset=Charset.forName("utf-8");
	private String authorization=null;
	private String contentType=null;
	
	public HttpClientUtil() {
	}

	public static HttpClientUtil getInstance() {
		return new HttpClientUtil();
	}
	
	public HttpClientRequest get(String url) {
		requestBuilder = RequestBuilder.get().setUri(url).setConfig(requestConfig);
		return new HttpClientRequest();
	}
	
	public HttpClientRequest delete(String url) {
		requestBuilder = RequestBuilder.delete().setUri(url).setConfig(requestConfig);
		return new HttpClientRequest();
	}
	
	public HttpClientRequest put(String url) {
		requestBuilder = RequestBuilder.put().setUri(url).setConfig(requestConfig);
		return new HttpClientRequest();
	}
	
	public HttpClientUtil setAuthorization(String userName, String password) {
		this.authorization="Basic "+Base64.getEncoder().encodeToString(new String(userName+":"+password).getBytes(charset));
		return this;
	}
	
	public HttpClientUtil setContentType(String contentType) {
		this.contentType=contentType;
		return this;
	}

	public HttpClientUtil setCharset(Charset charset) {
		this.charset=charset;
		return this;
	}
	
	public class HttpClientRequest {
		private Integer retry = 5;
		private String reponseContent;
		private BasicCookieStore cookieStore = new BasicCookieStore();

		public HttpClientRequest() {
			request();
		}

		private void request() {
			String url = requestBuilder.getUri().toString();
			logger.info("请求地址url-->" + url);
			CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore)
					.setRedirectStrategy(new LaxRedirectStrategy()).build();
			try {
				requestBuilder.setCharset(charset);
				HttpUriRequest request = requestBuilder.build();
				if (osName.indexOf("window") >= 0) {
					request.setHeader("User-Agent", DEFAULT_WINDOWS_REQUESTER_HEADER_USER_AGENT);
				} else {
					request.setHeader("User-Agent", DEFAULT_LINUX_REQUESTER_HEADER_USER_AGENT);
				}
				if (authorization != null) {
					request.setHeader("Authorization", authorization);
				}
				if (contentType != null) {
					request.setHeader("Content-type", contentType);
				}
				CloseableHttpResponse httpResponse = httpClient.execute(request);
				reponseContent = EntityUtils.toString(httpResponse.getEntity(), charset);
			} catch (ClientProtocolException e) {
				e.printStackTrace();
				logger.info("请求地址[ " + url + " ]异常");
			} catch (SocketTimeoutException e) { // 如果出现超时的异常就重试
				if (--retry > 0) {
					logger.error("请求地址[ " + url + " ]异常--进行重试次:" + retry, e);
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					request();
				}
			} catch (IOException e) {
				logger.error("请求地址[ " + url + " ]异常", e);
			} finally {
				if (httpClient != null) {
					try {
						httpClient.close();
					} catch (IOException e) {
						logger.error("httpClient.close() 异常", e);
					}
				}
			}
		}


		public String getReponseContent() {
			return reponseContent;
		}

		public List<Cookie> getCookies() {
			return cookieStore.getCookies();
		}

	}
	
	public HttpClientRequest post(String url,String requestBody) {
		 return post(url, null, new StringEntity(requestBody,charset));
	}
	
	
	public HttpClientRequest post(String url,Map<String, String> formData) {
		return post(url, formData, null);
	}
	
	private HttpClientRequest post(String url, Map<String, String> formData,HttpEntity httpEntity) {
		requestBuilder = RequestBuilder.post().setUri(url).setConfig(requestConfig);
		if (formData != null && !formData.isEmpty()) {
			Set<String> ks = formData.keySet();
			for (String k : ks) {
				requestBuilder.addParameter(k, formData.get(k));
			}
		}
		if(httpEntity!=null) {
			requestBuilder.setEntity(httpEntity);
		}
		return new HttpClientRequest();
	}
}

使用样例:

	@Test
	public void get() {
		System.err.println(HttpClientUtil.getInstance()
				.setAuthorization("admin", "admin")
				.setContentType("application/json")
				.get("http://192.168.177.107:7180/api/v19/users/admin").getReponseContent());;
	}

 

转载于:https://my.oschina.net/haopeng/blog/2874278

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值