HttpClient实现跨域访问-入门

项目A和项目B部署在不同的主机上,或者部署在同一个主机的不同端口下,AB之间的访问涉及跨域。

A需要B响应数据,而B的数据格式不是A想要的,此时可以使用HttpClient实现跨域访问,并且用java代码完成数格式转换。

添加依赖


    org.apache.httpcomponents
    httpclient
    4.3.5

demo

package com.clc.test;
 
import java.io.IOException;
import java.net.URI;

import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
 
public class Test {
	public static void main(String[] args) throws IOException {
		//获取httpClient
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		try {
			//创建请求地址
			URI uri = new URIBuilder("https://www.baidu.com/s").setParameter("wd", "csdn").build();
			//创建请求
			HttpGet httpGet = new HttpGet(uri);
			//HttpGet httpGet = new HttpGet("https://www.baidu.com/s?wd=csdn");
			
			//请求配置
			RequestConfig config = RequestConfig.custom().setConnectTimeout(1000)//允许创建连接的最大时长
					.setConnectionRequestTimeout(500)//允许从连接池中获取连接的最大时长
					.setSocketTimeout(10000)//允许数据传输的最大时长
					.setStaleConnectionCheckEnabled(true)//提交请求前测试连接是否可用
					.build();
			httpGet.setConfig(config);
			
			//发送请求,接收响应数据
			response = httpClient.execute(httpGet);
			
			//获取状态码
			System.out.println(response.getStatusLine().getStatusCode());
			
			//获取响应数据
			String content = EntityUtils.toString(response.getEntity(),"utf-8");
			System.out.println(content);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			if (response != null) {
				response.close();
			}
			if (httpClient != null) {
				httpClient.close();
			}
		}
	}

	private static Builder Builder() {
		// TODO Auto-generated method stub
		return null;
	}
 
}

连接管理器-demo(作用类似数据库连接池)

package com.clc.test;

import java.io.IOException;

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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class HttpClientTest {
	public static void main(String[] args) throws IOException {
		//创建连接管理器
		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
		//连接管理器设置
		//设置最大连接数
		connManager.setMaxTotal(200);
		//设置每个主机地址的并发数
		connManager.setDefaultMaxPerRoute(20);
		
		//请求配置
		RequestConfig reqConfig = RequestConfig.custom().setConnectTimeout(1000)//允许创建连接的最大时长
				.setConnectionRequestTimeout(500)//允许从连接池中获取连接的最大时长
				.setSocketTimeout(10000)//允许数据传输的最大时长
				.setStaleConnectionCheckEnabled(true)//提交请求前测试连接是否可用
				.build();
		
		CloseableHttpResponse response1 = doGet(connManager,reqConfig,"https://www.baidu.com/s?wd=csdn");
		System.out.println(response1.getStatusLine().getStatusCode());
		System.out.println(EntityUtils.toString(response1.getEntity(),"utf-8"));
		
		CloseableHttpResponse response2 = doGet(connManager,reqConfig,"https://www.baidu.com");
		System.out.println(response2.getStatusLine().getStatusCode());
		System.out.println(EntityUtils.toString(response2.getEntity(),"utf-8"));
	}

	private static CloseableHttpResponse doGet(PoolingHttpClientConnectionManager connManager, RequestConfig reqConfig, String uri) {
		//从连接管理器中获取httpClient
		CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
		CloseableHttpResponse response = null;
		try {
			//创建请求
			HttpGet httpGet = new HttpGet(uri);
			httpGet.setConfig(reqConfig);
			
			//发送请求,接收响应数据
			response = httpClient.execute(httpGet);
			return response;
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			if (response != null) {
				try {
					response.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			//连接池会随着httpClientde的销毁而销毁,所以此处不能关闭httpClient
	//					if (httpClient != null) {
	//						httpClient.close();
	//					}
		}
		return null;
	}

}

 

你可能感兴趣的:(HttpClient实现跨域访问-入门)