欢迎光临
一个有态度、有温度的分享型博客

使用Jersey构建RESTful服务之通过jersey-client客户端调用web服务模拟CURD操作

请先看汇总篇「Web Service入门及实践」,学习前面的基础知识和例子再来看这篇!

使用Web Service时,最常用的操作就是CURD,这个例子就是通过xml或json格式的数据在客户端与服务端交互,实现对CURD操作的模拟,例子中的CURD操作都是在内存中进行的。

首先新建一个实体类User

具体代码跟demo2,demo3相同。

然后增加一个resource

代码如下:

package com.demo4.resources;

import com.demo4.bean.User;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 通过jersey客户端实现web service的CURD操作,
 * 这里的模拟操作都是在内存中进行的
 */

@Path("/userClientResource")
public class UserClientResource {

    private static Map<String, User> userMap = new HashMap<String, User>();//存储用户

    /**
     * 增加用户
     * Consumes表示可以接受的client发送过来的MIME类型
     *
     * @param user
     */
    @POST
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public void createUser(User user) {
        userMap.put(user.getUserId(), user);
    }

    /**
     * 删除用户
     *
     * @param id
     */
    @DELETE
    @Path("{id}")
    public void deleteUser(@PathParam("id") String id) {
        userMap.remove(id);
    }

    /**
     * 修改用户信息
     *
     * @param user
     */
    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public void updateUser(User user) {
        userMap.put(user.getUserId(), user);
    }

    /**
     * 根据id查询指定用户信息
     * MediaType可以指定多个,如果客户端没有指定要返回的类型,则默认是前面那个
     *
     * @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;
    }

    /**
     * 查询所有用户
     * MediaType可以指定多个,如果客户端没有指定要返回的类型,则默认是前面那个
     *
     * @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;
    }

}

然后是一个client

我们通过client向服务端发送请求,具体client端的代码如下:

package com.demo4.client;

import com.demo4.bean.User;

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;

public class UserClient {
    private static String serverUri = "http://localhost:8080/jerseydemo/rest";

    /**
     * @param args
     */
    public static void main(String[] args) {
        addUser();
        getAllUsers();
        updateUser();
        getUserById();
        getAllUsers();
        delUser();
        getAllUsers();

    }

    /**
     * 添加用户(以Json的格式向web service发送请求)
     */
    private static void addUser() {
        System.out.println("****增加用户addUser****");
        User user = new User("006", "Susan", "21");
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(serverUri + "/userClientResource");
        //指定请求的参数类型,target.request(). 后面跟的是请求的方法:POST,GET,PUT或DELETE
        Response response = target.request().buildPost(Entity.entity(user, MediaType.APPLICATION_JSON)).invoke();
        System.out.println("增加用户Susan...");
        response.close();
    }

    /**
     * 删除用户
     */
    private static void delUser() {
        System.out.println("****删除用户****");
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(serverUri + "/userClientResource/006");
        //target.request(). 后面跟的是请求的方法:POST,GET,PUT或DELETE
        Response response = target.request().delete();
        System.out.println("删除ID为006的用户...");
        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 + "/userClientResource");
        //target.request(). 后面跟的是请求的方法:POST,GET,PUT或DELETE
        Response response = target.request().buildPut(Entity.entity(user, MediaType.APPLICATION_XML)).invoke();
        System.out.println("修改Susan的年龄为33...");
        response.close();
    }

    /**
     * 根据id查询用户
     */
    private static void getUserById() {
        System.out.println("****根据id查询用户****");
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(serverUri + "/userClientResource/006");
        //target.request(). 后面跟的是请求的方法:POST,GET,PUT或DELETE
        Response response = target.request().get();
        User user = response.readEntity(User.class);
        System.out.println("用户ID:" + 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 + "/userClientResource");
        // 使用默认的返回类型,target.request(). 后面跟的是请求的方法:POST,GET,PUT或DELETE
        Response response = target.request().get();
        //指定返回为json格式
        //Response response = target.request(MediaType.APPLICATION_JSON).get();
        String value = response.readEntity(String.class);
        System.out.println(value);
        response.close();  //关闭连接
    }
}


运行client

执行结果如下:

****增加用户addUser****
增加用户Susan...
****查询所有getAllUsers****
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><users><user><age>21</age><userId>006</userId><userName>Susan</userName></user></users>
****修改用户updateUser****
修改Susan的年龄为33...
****根据id查询用户****
用户ID:006,用户姓名:Susan,用户年龄:33
****查询所有getAllUsers****
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><users><user><age>33</age><userId>006</userId><userName>Susan</userName></user></users>
****删除用户****
删除ID为006的用户...
****查询所有getAllUsers****
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><users></users>

源码

移步「Github-jerseydemo-demo4」

参考文章:

  1. 用Jersey构建RESTful服务4–通过jersey-client客户端调用Jersey的Web服务模拟CURD

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址