zoukankan      html  css  js  c++  java
  • HTTP连接池

         <context:property-placeholder location="classpath:conf/framework/httpclient.properties"/>
    	<!-- 定义连接管理器 -->
    	<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 id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient"
    		factory-bean="httpClientBuilder" factory-method="build" scope="prototype">
    	</bean>
    
    	<!-- 定义清理无效连接 -->
    	<bean class="com.avcon.platform.dledc.res.service.IdleConnectionEvictor"
    		destroy-method="shutdown">
    		<constructor-arg index="0" ref="httpClientConnectionManager" />
    	</bean>
    
    	<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 id="requestConfig" class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder" factory-method="build">
    	</bean>
    

      

    @Service
    public class HttpClientService {
    
    	@Autowired
    	private CloseableHttpClient httpClient;
    	
    	@Autowired
    	private RequestConfig requestConfig;
    	
    	/**
    	 * 执行GET请求
    	 * 
    	 * @param url
    	 * @return
    	 * @throws IOException
    	 * @throws ClientProtocolException
    	 */
    	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 params
    	 * @return
    	 * @throws URISyntaxException
    	 * @throws IOException
    	 * @throws ClientProtocolException
    	 */
    	public String doGet(String url, Map<String, String> params)
    			throws ClientProtocolException, IOException, URISyntaxException {
    		URIBuilder uriBuilder = new URIBuilder(url);
    		for (String key : params.keySet()) {
    			uriBuilder.addParameter(key, params.get(key));
    		}
    		return this.doGet(uriBuilder.build().toString());
    	}
    	
    	/**
    	 * 执行POST请求
    	 * 
    	 * @param url
    	 * @param params
    	 * @return
    	 * @throws IOException
    	 */
    	public HttpResult doPost(String url, Map<String, String> params) throws IOException {
    		// 创建http POST请求
    		HttpPost httpPost = new HttpPost(url);
    		httpPost.setConfig(this.requestConfig);
    		if (params != null) {
    			// 设置2个post参数,一个是scope、一个是q
    			List<NameValuePair> parameters = new ArrayList<NameValuePair>();
    			for (String key : params.keySet()) {
    				parameters.add(new BasicNameValuePair(key, params.get(key)));
    			}
    			// 构造一个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 IOException
    	 */
    	public HttpResult doPost(String url) throws IOException {
    		return this.doPost(url, null);
    	}
    	
    	/**
    	 * 提交json数据
    	 * 
    	 * @param url
    	 * @param json
    	 * @return
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException {
    		// 创建http POST请求
    		HttpPost httpPost = new HttpPost(url);
    		httpPost.setConfig(this.requestConfig);
    
    		if (json != null) {
    			// 构造一个form表单式的实体
    			StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
    			// 将请求实体设置到httpPost对象中
    			httpPost.setEntity(stringEntity);
    		}
    
    		CloseableHttpResponse response = null;
    		try {
    			// 执行请求
    			response = this.httpClient.execute(httpPost);
    			return new HttpResult(response.getStatusLine().getStatusCode(),
    					EntityUtils.toString(response.getEntity(), "UTF-8"));
    		} finally {
    			if (response != null) {
    				response.close();
    			}
    		}
    	}
    

      

  • 相关阅读:
    分析 ajax 请求并抓取 “今日头条的街拍图”
    requests + 正则表达式 获取 ‘猫眼电影top100’。
    爬虫基础(暂缓更新)
    Git 操作笔记:分布式版本控制系统
    python补充
    python基础
    8.最佳电影聚类分析
    文本分析 笔记
    7.文档聚类
    5.词项相似度分析
  • 原文地址:https://www.cnblogs.com/zhoucx66/p/7193566.html
Copyright © 2011-2022 走看看