一、 HttpClient 简介
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、 功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net 包中已经提 供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能 还不够丰富和灵活。
二、 HttpClient 应用
1 发送 GET 请求不带参数
1.1 创建项目
创建一个maven project 的 jar项目。
1.2 修改 POM 文件添加 HttpClient 坐标
1.3 编写测试代码
6 HttpClient 自定义工具类的使用
6.1 编写工具类
public class HttpClientUtil {
//get 带参
public static String doGet(String url, Map<String, String> param) {
// 创建一个HttpClient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//定义返回结果
String resultString = "";
CloseableHttpResponse response = null;
try {
// 创建URI
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求并返回响应
response = httpclient.execute(httpGet);
//判断返回状态是否200成功
if (response.getStatusLine().getStatusCode() == 200) {
//把返回的对象转为字符串,格式是“UTF-8”
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
//get 不带参
public static String doGet(String url) {
return doGet(url, null);
}
public static String doPost(String url, Map<String, String> param) {
// 创建一个Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建一个Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8");
httpPost.setEntity(entity);
}
// 执行http请求并返回响应
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
//post不带参
public static String doPost(String url) {
return doPost(url, null);
}
//post json格式参数
public static String doPostJson(String url, String json) {
// 创建一个Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建一个Http Post对象
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求并返回响应
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
}
6.2 测试工具类
//通过HttpClientUtil调用方法发送get,post请求的方式
String result = HttpClientUtil.doPost(url, param);
三、 实战案例
1 需求
- 采用 SOA 架构项目
- 使用 HttpClient 调用服务
- 完成用户的添加与查询
2 项目架构
![9242e9ba8563036c92645f8c00bed00d.png](https://img-blog.csdnimg.cn/img_convert/9242e9ba8563036c92645f8c00bed00d.png)
3 表结构
CREATE TABLE `users` ( `userid` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) DEFAULT NULL,
`userage` int(11) DEFAULT NULL, PRIMARY KEY (`userid`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
4 创建项目
4.1 创建 commons 项目
4.1.1 创建项目
创建Maven project 的 jar 项目。
4.1.2 需改 POM 文件
添加以下依赖
<dependencies>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency>
</dependencies>
4.2 创建 service 项目
4.2.1 创建项目
4.2.2 修改 POM 文件
添加以下依赖和插件。
<dependencies>
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
4.3 创建 client 项目
4.3.1 创建项目
创建Maven project的war项目。
4.3.2 修改 POM 文件
添加以下依赖和插件
<dependencies>
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>8081</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
5. Client 项目
5.1 JSP页面
addUser.jsp :
<form action="/user/addUser" method="post">
用户姓名:<input type="text" name="username"/><br/>
用户年龄:<input type="text" name="userage"/><br/>
<input type="submit" value="OK"/>
</form>
showUser.jsp:
<table border="1" align="center">
<tr>
<th>用户ID</th>
<th>用户姓名</th>
<th>用户年龄</th>
</tr>
<c:forEach items="${list }" var="user">
<tr>
<td>${user.userid }</td>
<td>${user.username }</td>
<td>${user.userage }</td>
</tr>
</c:forEach>
</table>
5.2UserService
@Service
public class UserServiceImpl implements UserService {
//添加用户
@Override
public void addUser(Users user) {
String json = JsonUtils.objectToJson(user);
//访问service端
String code = HttpClientUtil.doPostJson("http://localhost:8080/user/insertUser", json);
Map<String, Integer> map = JsonUtils.jsonToPojo(code, Map.class);
Integer var = map.get("code");
if(var == 500){
System.out.println("操作失败");
}else{
System.out.println("操作成功");
}
}
//查询所有用户
@Override
public List<Users> findUserAll() {
String var = HttpClientUtil.doPost("http://localhost:8080/user/selectUserAll");
List<Users> list = JsonUtils.jsonToList(var, Users.class);
return list;
}
}
5.3UserController
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 添加
*/
@RequestMapping("/addUser")
public String addUser(Users user){
this.userService.addUser(user);
return "ok";
}
/**
* 查询所有
*/
@RequestMapping("/findUser")
public String findUserAll(Model model){
List<Users> list = this.userService.findUserAll();
model.addAttribute("list", list);
return "showUser";
}
}
6 Service项目
6.1UserMapper
UserMapper.java:
public interface UserMapper {
public void insertUser(Users user);
public List<Users> selectUserAll();
Users findUserById(int userid);
void updateUser(Users users);
}
6.2 UserService
UserserviceImpl实现类:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void insertUser(Users user) {
this.userMapper.insertUser(user);
}
@Override
public List<Users> selectUserAll() {
return this.userMapper.selectUserAll();
}
}
6.3 UserController
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/insertUser")
@ResponseBody
public Object insertUser(@RequestBody Users user){
Map<String, Integer> map = new HashMap<>();
try{
this.userService.insertUser(user);
map.put("code", 200);
}catch(Exception e){
e.printStackTrace();
map.put("code", 500);
}
return map;
}
@RequestMapping("/selectUserAll")
@ResponseBody
public Object selectUserAll(){
return this.userService.selectUserAll();
}
}