httpclient的封装
Posted ushowtime
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpclient的封装相关的知识,希望对你有一定的参考价值。
package utils; import dao.PlatformDao; import okhttp3.RequestBody; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.NameValuePair; import org.apache.http.client.ResponseHandler; import org.apache.http.client.config.RequestConfig; 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.entity.StringEntity; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; import java.util.*; /** * http请求器 * @author songmin */ public class SpiderHttpClient { private static final Logger log = LoggerFactory.getLogger(SpiderHttpClient.class); String proxyIP; Integer proxyPort; String responseParam = null; String url; String defaultEncoding = "gbk"; String contentEncoding = "UTF-8"; String chartSet = "UTF-8"; String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/77.0.3865.90 Safari/537.36"; private static final String HEADER_REFERER = "Referer"; private static final String HEADER_COOKIE = "Cookie"; private static final String HEADER_USER_AGENT = "User-Agent"; Map<String, String> headerMap = new HashMap<String, String>(); Map<String, String> bodyMap = new HashMap<>(); public SpiderHttpClient(String url) { this.url = url; headerMap.put(HEADER_USER_AGENT, userAgent); } /** * 设置请求体 * @param key * @param value */ public void setBody(String key,String value){ bodyMap.put(key,value); } public void setProxyIP(String proxyIP) { if (proxyIP != null && !proxyIP.isEmpty()) { this.proxyIP = proxyIP; } } public void setProxyPort(Integer proxyPort) { if (proxyPort != null && proxyPort != 0) { this.proxyPort = proxyPort; } } /**设置字符格式*/ public void setChartSet(String chartSet){ this.chartSet = chartSet; } /** * 设置请求头 * * @param key * @param value */ public void setHeader(String key, String value) { headerMap.put(key, value); } /** * 设置referer * * @param referer */ public void setReferer(String referer) { setHeader(HEADER_REFERER, referer); } /** * 设置cookie * * @param cookie */ public void setCookie(String cookie) { setHeader(HEADER_COOKIE, cookie); } /** * 设置编码 */ public void setEncoding(String encoding) { this.defaultEncoding = encoding; } /** * 设置origin * @param origin */ public void setOrigin(String origin){ setHeader("Origin",origin); } public void setHost(String host){ setHeader("Host",host); } public void setContentType(String contentType){ setHeader("Content-Type",contentType); } public void setAcceptEncoding(String acceptEncoding){ setHeader("Accept-Encoding",acceptEncoding); } /** * 获取响应头 */ public String getResponseHeader(String key) throws IOException { this.responseParam = key; HttpResponse httpResponse = getResponse(url); String responseHeader = httpResponse.getResponseHeaderParam(); return responseHeader; } /** * 获取网页内容 * * @return */ public String getContent() throws IOException { HttpResponse httpResponse = getResponse(url); String html = httpResponse.getContent(); return html; } /** * 获取响应 * * @return */ public HttpResponse getResponse(String url) throws IOException { String content = null; //创建httpClient实例 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建httpGet实例 HttpGet httpGet = new HttpGet(url); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(10000) .setSocketTimeout(10000) .setConnectionRequestTimeout(3000) .build(); //设置代理IP,设置连接超时时间 、 设置 请求读取数据的超时时间 、 设置从connect Manager获取Connection超时时间、 if (proxyIP != null && proxyPort != null && !proxyIP.isEmpty()) { HttpHost proxy = new HttpHost(proxyIP, proxyPort); requestConfig = RequestConfig.custom() .setProxy(proxy) .setConnectTimeout(10000) .setSocketTimeout(10000) .setConnectionRequestTimeout(3000) .build(); } Iterator<String> iterator = headerMap.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); httpGet.setHeader(key, headerMap.get(key)); } httpGet.setConfig(requestConfig); //设置请求头消息 CloseableHttpResponse response = httpClient.execute(httpGet); String responseHeader = ""; if (response != null) { HttpEntity entity = response.getEntity(); if (responseParam != null) { responseHeader = response.getFirstHeader(responseParam).getValue(); } if (entity != null) { content = EntityUtils.toString(entity, defaultEncoding); } } if (response != null) { response.close(); } if (httpClient != null) { httpClient.close(); } HttpResponse httpResponse = new HttpResponse(); httpResponse.setContent(content); httpResponse.setResponseHeaderParam(responseHeader); return httpResponse; } /** * 携带json发送post请求 * @param json 请求json * @return 返回值 */ public String sendJson(String json) { String returnValue = "这是默认返回值,接口调用失败"; CloseableHttpClient httpClient = HttpClients.createDefault(); ResponseHandler<String> responseHandler = new BasicResponseHandler(); try{ //第一步:创建HttpClient对象 httpClient = HttpClients.createDefault(); //第二步:创建httpPost对象 HttpPost httpPost = new HttpPost(url); Iterator<String> iterator = headerMap.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); httpPost.setHeader(key, headerMap.get(key)); } //第三步:给httpPost设置JSON格式的参数 StringEntity requestEntity = new StringEntity(json,chartSet); requestEntity.setContentEncoding(contentEncoding); httpPost.setEntity(requestEntity); //第四步:发送HttpPost请求,获取返回值 //调接口获取返回值时,必须用此方法 returnValue = httpClient.execute(httpPost,responseHandler); } catch(Exception e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //第五步:处理返回值 return returnValue; } /** * 发送post请求 * @return 请求结果 * @throws IOException */ public String sendHttpPost() throws IOException { CloseableHttpClient httpClient = HttpClients.createDefault(); ResponseHandler<String> responseHandler = new BasicResponseHandler(); HttpPost httpPost = new HttpPost(url); Iterator<String> iterator = headerMap.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); httpPost.setHeader(key, headerMap.get(key)); } // 创建参数队列 List<NameValuePair> nameValuePairs = new ArrayList<>(); for (String key : bodyMap.keySet()) { nameValuePairs.add(new BasicNameValuePair(key, bodyMap.get(key))); } try { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); } catch (Exception e) { e.printStackTrace(); } String result = httpClient.execute(httpPost,responseHandler); return result; } }
以上是关于httpclient的封装的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装