HttpClient
来源:互联网 发布:js处理json数据 编辑:程序博客网 时间:2024/06/06 02:55
第一步:导入依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.5</version> </dependency>
第二步:httpclient和spring整合applicationContext-httpclient.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 定义连接管理器 --><bean id="httpClientConnectionManager"class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager"destroy-method="close"><!-- 设置最大连接数 --><property name="maxTotal" value="${http.maxTotal}" /><!-- 设置每个主机地址的并发数 --><property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}" /></bean><!-- Httpclient构建器 --><bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"><property name="connectionManager" ref="httpClientConnectionManager" /></bean><!-- 定义HttpClient对象 --><!-- 该bean一定是多例的 --><bean class="org.apache.http.impl.client.CloseableHttpClient"factory-bean="httpClientBuilder" factory-method="build" scope="prototype" /><bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder"><!-- 创建连接的最长时间 --><property name="connectTimeout" value="${http.connectTimeout}" /><!-- 从连接池中获取到连接的最长时间 --><property name="connectionRequestTimeout" value="${http.connectionRequestTimeout}" /><!-- 数据传输的最长时间 --><property name="socketTimeout" value="${http.socketTimeout}" /><!-- 提交请求前测试连接是否可用 --><property name="staleConnectionCheckEnabled" value="${http.staleConnectionCheckEnabled}" /></bean><!-- 请求参数对象 --><bean class="org.apache.http.client.config.RequestConfig"factory-bean="requestConfigBuilder" factory-method="build"></bean><!-- 定期清理无效连接 --><bean class="com.taotao.web.httpclient.IdleConnectionEvictor" destroy-method="shutdown"><constructor-arg index="0" ref="httpClientConnectionManager"/><constructor-arg index="1" value="${http.waitTime}"/></bean></beans>第三步:写httpclient.properties
http.connectionRequestTimeout=500http.connectTimeout=5000http.socketTimeout=30000http.staleConnectionCheckEnabled=truehttp.waitTime=300000http.maxTotal=200http.defaultMaxPerRoute=100第四步:spring配置文件了把httpclient.properties添加上
<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><!-- 允许JVM参数覆盖 --><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /><!-- 忽略没有找到的资源文件 --><property name="ignoreResourceNotFound" value="true" /><!-- 配置资源文件 --><property name="locations"><list><value>classpath:httpclient.properties</value><value>classpath:env.properties</value></list></property></bean>第五步:写IdleConnectionEvictor类用于定期清理无效的http连接
package com.taotao.web.httpclient;import org.apache.http.conn.HttpClientConnectionManager;/** * 定期清理无效的http连接 */public class IdleConnectionEvictor extends Thread { private final HttpClientConnectionManager connMgr; private Integer waitTime; private volatile boolean shutdown; public IdleConnectionEvictor(HttpClientConnectionManager connMgr,Integer waitTime) { this.connMgr = connMgr; this.waitTime = waitTime; this.start(); } @Override public void run() { try { while (!shutdown) { synchronized (this) { wait(waitTime); // 关闭失效的连接 connMgr.closeExpiredConnections(); } } } catch (InterruptedException ex) { // 结束 } } /** * 销毁释放资源 */ public void shutdown() { shutdown = true; synchronized (this) { notifyAll(); } }}
第六步:写HttpResult
package com.taotao.common.bean;public class HttpResult { private Integer code; private String data; public HttpResult() { } public HttpResult(Integer code, String data) { this.code = code; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getData() { return data; } public void setData(String data) { this.data = data; }}第七步:封装ApiService
package com.taotao.web.service;import java.io.IOException;import java.net.URISyntaxException;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;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.client.utils.URIBuilder;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.taotao.common.bean.HttpResult;@Servicepublic class ApiService { @Autowired private CloseableHttpClient httpclient; @Autowired private RequestConfig requestConfig; /** * 执行GET请求,200返回响应内容,其他状态码返回null * * @param url * @return * @throws ClientProtocolException * @throws IOException */ public String doGet(String url) throws ClientProtocolException, IOException { // 创建http GET请求 HttpGet httpGet = new HttpGet(url); // 设置请求参数 httpGet.setConfig(this.requestConfig); CloseableHttpResponse response = null; try { // 执行请求 response = httpclient.execute(httpGet); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { return EntityUtils.toString(response.getEntity(), "UTF-8"); } } finally { if (response != null) { response.close(); } } return null; } /** * 指定带有参数的GET请求 * * @param url * @param param * @return * @throws ClientProtocolException * @throws IOException * @throws URISyntaxException */ public String doGet(String url, Map<String, String> param) throws ClientProtocolException, IOException, URISyntaxException { URIBuilder builder = new URIBuilder(url); for (Map.Entry<String, String> entry : param.entrySet()) { builder.addParameter(entry.getKey(), entry.getValue()); } return doGet(builder.build().toString()); } /** * 带有参数的post请求 * * @param url * @param param * @return * @throws ClientProtocolException * @throws IOException */ public HttpResult doPost(String url, Map<String, String> param) throws ClientProtocolException, IOException { // 创建http POST请求 HttpPost httpPost = new HttpPost(url); // 设置请求参数 httpPost.setConfig(this.requestConfig); if (null != param) { // 设置post参数 List<NameValuePair> parameters = new ArrayList<NameValuePair>(0); for (Map.Entry<String, String> entry : param.entrySet()) { parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } // 构造一个form表单式的实体 UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8"); // 将请求实体设置到httpPost对象中 httpPost.setEntity(formEntity); } CloseableHttpResponse response = null; try { // 执行请求 response = httpclient.execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString( response.getEntity(), "UTF-8")); } finally { if (response != null) { response.close(); } } } /** * 执行post请求 * * @param url * @return * @throws ClientProtocolException * @throws IOException */ public HttpResult doPost(String url) throws ClientProtocolException, IOException { return doPost(url, null); }}第八步:EasyUIResult
package com.taotao.common.bean;import java.util.List;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;public class EasyUIResult { // 定义jackson对象 private static final ObjectMapper MAPPER = new ObjectMapper(); private Integer total; private List<?> rows; public EasyUIResult() { } public EasyUIResult(Integer total, List<?> rows) { this.total = total; this.rows = rows; } public EasyUIResult(Long total, List<?> rows) { this.total = total.intValue(); this.rows = rows; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } public List<?> getRows() { return rows; } public void setRows(List<?> rows) { this.rows = rows; } /** * Object是集合转化 * * @param jsonData json数据 * @param clazz 集合中的类型 * @return */ public static EasyUIResult formatToList(String jsonData, Class<?> clazz) { try { JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("rows"); List<?> list = null; if (data.isArray() && data.size() > 0) { list = MAPPER.readValue(data.traverse(), MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } return new EasyUIResult(jsonNode.get("total").intValue(), list); } catch (Exception e) { return null; } }}第九步:IndexService
package com.taotao.web.service;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.fasterxml.jackson.databind.ObjectMapper;import com.taotao.common.bean.EasyUIResult;import com.taotao.manage.pojo.Content;@Servicepublic class IndexService { public static final ObjectMapper MAPPER=new ObjectMapper(); @Value("${MANAGE_TAOTAO_URL}") String MANAGE_TAOTAO_URL; @Value("${INDEX_AD1_URL}") String INDEX_AD1_URL; @Autowired private ApiService apiService;// //方法一 // public String getIndexAd1() {// // 通过调用后台系统系统的接口获取数据// String url = MANAGE_TAOTAO_URL + INDEX_AD1_URL;// try {// String jsonData = this.apiService.doGet(url);// // 解析json,获取需要的数据// // 封装成前端所需的格式//// JsonNode jsonNode = MAPPER.readTree(jsonData);// ArrayNode arrayNode = (ArrayNode) jsonNode.get("rows");//// List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();//// for (JsonNode node : arrayNode) {// Map<String, Object> map = new LinkedHashMap<String, Object>();// map.put("srcB", node.get("pic").asText());// map.put("height", 240);// map.put("alt", node.get("title").asText());// map.put("width", 670);// map.put("src", map.get("srcB"));// map.put("widthB", 550);// map.put("href", node.get("url").asText());// map.put("heightB", 240);//// result.add(map);// }// //将java对象序列化成json// return MAPPER.writeValueAsString(result);//// } catch (Exception e) {// e.printStackTrace();// }// return null;// } //方法二 @SuppressWarnings("unchecked") public String getIndexAd1() { // 通过调用后台系统系统的接口获取数据 String url = MANAGE_TAOTAO_URL + INDEX_AD1_URL; try { String jsonData = this.apiService.doGet(url); // 解析json,获取需要的数据 // 封装成前端所需的格式 EasyUIResult easyUIResult=EasyUIResult.formatToList(jsonData, Content.class); List<Content> contents=(List<Content>) easyUIResult.getRows(); List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); for (Content content : contents) { Map<String, Object> map = new LinkedHashMap<String, Object>(); map.put("srcB", content.getPic()); map.put("height", 240); map.put("alt",content.getTitle() ); map.put("width", 670); map.put("src", map.get("srcB")); map.put("widthB", 550); map.put("href", content.getUrl()); map.put("heightB", 240); result.add(map); } //将java对象序列化成json return MAPPER.writeValueAsString(result); } catch (Exception e) { e.printStackTrace(); } return null; }}第十步:env.properties
MANAGE_TAOTAO_URL=http://manage.taotao.comINDEX_AD1_URL=/rest/content?categoryId=52&page=1&rows=20第十一步:IndexController
package com.taotao.web.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;import com.taotao.web.service.IndexService;@Controllerpublic class IndexController { @Autowired private IndexService indexService; /** * 首页 */ @RequestMapping(value="index",method = RequestMethod.GET) public ModelAndView index(){ ModelAndView mv=new ModelAndView("index"); //查询大广告数据 mv.addObject("indexAd1",this.indexService.getIndexAd1()); return mv; }}第十二步:页面获取数据
${indexAd1}
0 0
- HttpClient
- HttpClient
- httpClient
- HttpClient
- HttpClient
- HttpClient
- HttpClient
- HttpClient
- HttpClient
- HttpClient
- HttpClient
- httpclient
- httpclient
- HttpClient
- HttpClient
- httpclient
- httpclient
- HttpClient
- 2016 Multi-University Training Contest 1题解报告
- python3的字符串
- 评估你的市场
- [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
- hdoj--2037 *今年暑假不AC(sort+结构体+贪心)
- HttpClient
- memcache 的相关使用
- Ad hoc query
- android中监听wifi广播的方法
- 【转载】Android Studio你不知道的调试技巧
- 从一个港独看怎么带团队
- AndFix使用源码分析
- 关于UIView的autoresizingMask属性的研究
- 《杂文》 --- 平台选择