一、概述
- HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。
- HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
二、使用示例
2.1 数据提供方
2.1.1 Entity
public class User {
private int age;
private String name;
public User() {
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.1.2 Controller
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping
public Object getAll(int age) {
return Arrays.asList(new User(age, "张三"), new User(age, "李四"));
}
}
2.1.3 访问http://localhost:8080/user

2.2 数据调用方
2.2.1 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
2.2.2 Entity
public class User {
private int age;
private String name;
public User() {}
public User(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.2.3 Utils
public class HttpProtocolHandler {
// 请求方式
public enum Request_method {
POST, GET
}
// Http连接管理器,该管理器必须是线程安全的
private static PoolingHttpClientConnectionManager connectionManager;
// 最大的连接数量
private int maxTotal = 100;
// 每个路径最大的连接数
private int maxConnPerRoute = 20;
private static HttpProtocolHandler httpProtocolHandler = new HttpProtocolHandler();
public HttpProtocolHandler() {
// Http连接池
connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotal);
connectionManager.setDefaultMaxPerRoute(maxConnPerRoute);
}
// 提供实例
public static HttpProtocolHandler getInstance() {
return httpProtocolHandler;
}
// 具体的调用方法
public String execute(Request_method requestMethod, String url, Map<String, String> paramsMap) {
String responseStr = null;
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();
List<NameValuePair> nameValuePair = generatNameValuePair(paramsMap);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePair, Consts.UTF_8);
HttpUriRequest uriRequest = Request_method.GET.equals(requestMethod) ? new HttpGet(generatRequestUrl(url, paramsMap)) : new HttpPost(url);
if (Request_method.POST.equals(requestMethod)) {
((HttpPost) uriRequest).setEntity(entity);
}
try {
HttpResponse httpResponse = httpClient.execute(uriRequest);
responseStr = EntityUtils.toString(httpResponse.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
return responseStr;
}
// POST请求参数的方法组装
public static List<NameValuePair> generatNameValuePair(Map<String, String> paramsMap) {
List<NameValuePair> nameValuePair = new LinkedList<NameValuePair>();
for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
nameValuePair.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
return nameValuePair;
}
// GET请求的参数的方法封装
public static String generatRequestUrl(String url, Map<String, String> paramsMap) {
StringBuffer fullUrl = new StringBuffer(url);
if (paramsMap != null && paramsMap.size() > 0) {
fullUrl.append("?");
int i = 0;
for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
i++;
String paramName = entry.getKey();
String paramValue = entry.getValue();
fullUrl.append(i == paramsMap.size() ? paramName + "=" + paramValue : paramName + "=" + paramValue + "&");
}
}
return fullUrl.toString();
}
}
使用方法:
HttpProtocolHandler.getInstance().execute(HttpProtocolHandler.Request_method.GET, URL, new HashMap<String, String>())
HttpProtocolHandler.Request_method.GET
: 请求的类型URL
: 请求的URL地址new HashMap<String, String>()
: 请求的参数
2.2.4 Controller
@RestController
@RequestMapping("/remote")
public class RemoteController {
@RequestMapping
public Object getUser() {
Map<String, String> map = new HashMap<>();
map.put("age","18");
String remoteUrl = "http://localhost:8080/user";
String result = HttpProtocolHandler.getInstance().execute(HttpProtocolHandler.Request_method.GET, remoteUrl, map);
List<User> users = JSON.parseArray(result, User.class);
return users;
}
}
2.2.5 YML
server:
port: 8082
2.2.6 Controller 访问http://localhost:8082/remote

网友评论