# 用Jersey構建RESTful服務4--通過jersey-client客戶端調用Jersey的Web服務模擬CURD
## 一、總體說明
通過jersey-client接口,創建客戶端程序,來調用Jersey實現的RESTful服務,實現增、刪、改、查等操作。 服務端主要是通過內存的方式,來模擬用戶的增加、刪除、修改、查詢等操作。
## 二、創建服務端
1. 在上文項目中, 在“com.waylau.rest.resources.UserResource“中修改代碼, 首先創建一個HashMap,用來保存添加的用戶
```
private static Map<String,User> userMap = new HashMap<String,User>();
```
2. 創建增、刪、改、查 用戶資源等操作
```
/**
* 增加
* @param user
*/
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void createStudent(User user) {
userMap.put(user.getUserId(), user );
}
/**
* 刪除
* @param id
*/
@DELETE
@Path("{id}")
public void deleteStudent(@PathParam("id")String id){
userMap.remove(id);
}
/**
* 修改
* @param user
*/
@PUT
@Consumes(MediaType.APPLICATION_XML)
public void updateStudent(User user){
userMap.put(user.getUserId(), user );
}
/**
* 根據id查詢
* @param id
* @return
*/
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public User getUserById(@PathParam("id") String id){
User u = userMap.get(id);
return u;
}
/**
* 查詢所有
* @return
*/
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<User> getAllUsers(){
List<User> users = new ArrayList<User>();
users.addAll( userMap.values() );
return users;
}
```
## 三、創建客戶端程序
創建包“com.waylau.rest.client”,在包下建一個UserClient.java,代碼如下:
```
package com.waylau.rest.client;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import com.waylau.rest.bean.User;
/**
* 用戶客戶端,用來測試資源
* @author waylau.com
* 2014-3-18
*/
public class UserClient {
private static String serverUri = "http://localhost:8089/RestDemo/rest";
/**
* @param args
*/
public static void main(String[] args) {
addUser();
getAllUsers();
updateUser();
getUserById();
getAllUsers();
delUser();
getAllUsers();
}
/**
* 添加用戶
*/
private static void addUser() {
System.out.println("****增加用戶addUser****");
User user = new User("006","Susan","21");
Client client = ClientBuilder.newClient();
WebTarget target = client.target(serverUri + "/users");
Response response = target.request().buildPost(Entity.entity(user, MediaType.APPLICATION_XML)).invoke();
response.close();
}
/**
* 刪除用戶
*/
private static void delUser() {
System.out.println("****刪除用戶****");
Client client = ClientBuilder.newClient();
WebTarget target = client.target(serverUri + "/users/006");
Response response = target.request().delete();
response.close();
}
/**
* 修改用戶
*/
private static void updateUser() {
System.out.println("****修改用戶updateUser****");
User user = new User("006","Susan","33");
Client client = ClientBuilder.newClient();
WebTarget target = client.target(serverUri + "/users");
Response response = target.request().buildPut( Entity.entity(user, MediaType.APPLICATION_XML)).invoke();
response.close();
}
/**
* 根據id查詢用戶
*/
private static void getUserById() {
System.out.println("****根據id查詢用戶****");
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);// 注冊json 支持
WebTarget target = client.target(serverUri + "/users/006");
Response response = target.request().get();
User user = response.readEntity(User.class);
System.out.println(user.getUserId() + user.getUserName() + user.getAge());
response.close();
}
/**
* 查詢所有用戶
*/
private static void getAllUsers() {
System.out.println("****查詢所有getAllUsers****");
Client client = ClientBuilder.newClient();
WebTarget target = client.target(serverUri + "/users");
Response response = target.request().get();
String value = response.readEntity(String.class);
System.out.println(value);
response.close(); //關閉連接
}
}
```
## 四、運行
啟動服務端項目,運行客戶端程序UserClient,控制臺輸出如下
```
****增加用戶addUser****
****查詢所有getAllUsers****
[{"userId":"006","userName":"Susan","age":"21"}]
****修改用戶updateUser****
****根據id查詢用戶****
006Susan33
****查詢所有getAllUsers****
[{"userId":"006","userName":"Susan","age":"33"}]
****刪除用戶****
****查詢所有getAllUsers****
[]
```
## 五、總結
1. 客戶端如果需要進行JSON轉換,需要進行JSON注冊
```
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);
```
2. WebTarget 指明了要請求的資源的地址
3. target.request(). 后面跟的是請求的方法:POST,GET,PUT或DELETE
**本章源碼**:[https://github.com/waylau/RestDemo/tree/master/jersey-demo4-client-curd](https://github.com/waylau/RestDemo/tree/master/jersey-demo4-client-curd)
- 用Jersey構建RESTful服務
- 用Jersey構建RESTful服務1--HelloWorld
- 用Jersey構建RESTful服務2--JAVA對象轉成XML輸出
- 用Jersey構建RESTful服務3--JAVA對象轉成JSON輸出
- 用Jersey構建RESTful服務4--通過jersey-client客戶端調用Jersey的Web服務模擬CURD
- 用Jersey構建RESTful服務5--Jersey+MySQL5.6+Hibernate4.3
- 用Jersey構建RESTful服務6--Jersey+SQLServer+Hibernate4.3
- 用Jersey構建RESTful服務7--Jersey+SQLServer+Hibernate4.3+Spring3.2
- 用Jersey構建RESTful服務8--Jersey+SQLServer+Hibernate4.3+Spring3.2+jquery
- 用Jersey構建RESTful服務9--Jersey+SQLServer+Hibernate4.3+Spring3.2+AngularJS
- 用 Jersey 2 和 Spring 4 構建 RESTful web service