restful风格的webService之自定义客户端、服务端交互案例

该项目创建的是IDEA的MAVEN的java项目
此次案例包含服务端和客户端。服务端用于发布地址,客户端用于测试服务端写的东西



服务端:↓

该案例服务端命名为:restfulStyle



步骤一:在pom.xml中添加依赖

 
        org.apache.cxf
        cxf-rt-frontend-jaxrs
        3.0.1
    
    
        org.apache.cxf
        cxf-rt-transports-http-jetty
        3.0.1
    
    
    
        org.apache.cxf
        cxf-rt-rs-client
        3.0.1
    
    
    
        org.apache.cxf
        cxf-rt-rs-extension-providers
        3.0.1
    

    
        org.codehaus.jettison
        jettison
        1.3.7
    
    
        com.fasterxml.jackson.jaxrs
        jackson-jaxrs-json-provider
        2.9.6
    

步骤二:创建会用到的实体类(记得给该实体类加@XmlRootElement注解)

此案例该实体类命名为:Users
package com.qf.Users;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement//实体类注解,标记当前要转换的格式。@XmlRootElement是基于restful风格的webService,客户端和服务器端之间通讯可以使用xml数据,json数据,@XmlRootElement用来指定对象序列化为xml或json数据时的根节点名称,也可以指定名字@XmlRootElement(name="")。如果指定名字,客户端和服务端的name值要相同。
public class Users {
    private int userid;
    private String username;
    private  String password;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

步骤三:创建接口。接口当中包含请求地址,返回什么数据类型

此案例该接口命名为:UsersDao
package com.qf.dao;

import com.qf.Users.Users;

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



@Produces("*/*")//规定了服务器返回给客户端的数据格式。此地*/*代表格式不限制
public interface UsersDao {
    @Path("/insert")
    @POST//post提交(即新增)数据
    public  int insertUsers(Users users);


    @Path("/update")
    @PUT//PUT更新数据
    public  int updateUsers(Users users);


    @Path("/delete/{uid}")//{uid}表示占位,前端请求地址中传过来的参数由uid获取。此时restful风格就体现出来了,前台传值格式为delete/1,1是传过来的参数
    @DELETE//DELETE删除数据
    public  int deleteUsers(@PathParam("uid") int userid);//@PathParam("uid") 代表将uid和userid绑定


    @Path("/getbyid/{id}")//restful这个占位符记得加{}大括号。客户端访问该方法的正确地址是:http://localhost:8080/users/getbyid/{id},即发布地址/请求地址/参数  的格式才能访问到
    @GET//GET取(查询)数据
    @Produces(MediaType.APPLICATION_JSON)//单独指定该方法返回值转换成json对象,表示以json格式返回给客户端。MediaType类有好几种数据格式,只需点一下就会提示。
    public  Users findbyid(@PathParam("id") int userid);


    @Path("/getall")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List findall();
}


步骤四:创建UsersDao的实现类,该类写请求地址具体的处理方法

此案例该实现类命名为为:UsersDaoImpl
package com.qf.dao.impl;

import com.qf.Users.Users;
import com.qf.dao.UsersDao;

import java.util.ArrayList;
import java.util.List;

public class UsersDaoImpl implements UsersDao{

    public int insertUsers(Users users) {
        System.out.println("insertUsers="+users);
        return 11;
    }

    public int updateUsers(Users users) {
        System.out.println("updateUsers="+users);
        return 22;
    }

    public int deleteUsers(int userid) {
        System.out.println("deleteUsers="+userid);
        return 33;
    }

    public Users findbyid(int userid) {
        System.out.println("findbyid="+userid);
        Users users=new Users();
        users.setUserid(110);
        users.setUsername("张三");
        users.setPassword("abc");
        return users;
    }

    public List findall() {
        List list=new ArrayList();
        System.out.println("findall");
        for (int i = 0; i < 5; i++) {
            Users users=new Users();
            users.setUserid(110);
            users.setUsername("张三");
            users.setPassword("abc");
            list.add(users);
        }
        return list;
    }
}

步骤五:在执行类中发布接口

此案例该执行类命名为为:Demo1
package com.qf.test;

import com.qf.dao.impl.UsersDaoImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;

public class Demo1 {
    public static void main(String[] args) {
    //创建服务工厂对象
        JAXRSServerFactoryBean factoryBean=new JAXRSServerFactoryBean();
        //设置服务地址
        factoryBean.setAddress("http://localhost:8080/users/");
        //设置实现类(服务类)对象
        factoryBean.setServiceBean(new UsersDaoImpl());
        //发布服务
        factoryBean.create();
        System.out.println("发布成功");
    }
}


服务端结构图:
restful风格的webService之自定义客户端、服务端交互案例_第1张图片

客户端:↓

该案例服务端命名为:restfulClient



步骤一:在pom.xml中添加依赖

  
        org.apache.cxf
        cxf-rt-frontend-jaxrs
        3.0.1
    
    
        org.apache.cxf
        cxf-rt-transports-http-jetty
        3.0.1
    
    
    
        org.apache.cxf
        cxf-rt-rs-client
        3.0.1
    
    
    
        org.apache.cxf
        cxf-rt-rs-extension-providers
        3.0.1
    

    
        org.codehaus.jettison
        jettison
        1.3.7
    
    
        com.fasterxml.jackson.jaxrs
        jackson-jaxrs-json-provider
        2.9.6
    

步骤二:将服务端的实体类(即Users)复制到客户端

package com.qf.entity;

//原来的费restful的客户端的代码都是由wsimport -s等命令自动生成的,但restful风格只是公司内部应用,因此还不普及,这个实体类只能从服务端复制过来
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement//实体类注解,标记当前要转换的格式。@XmlRootElement是基于restful风格的webService,客户端和服务器端之间通讯可以使用xml数据,json数据,@XmlRootElement用来指定对象序列化为xml或json数据时的根节点名称,也可以指定名字@XmlRootElement(name="")。如果指定名字,客户端和服务端的name值要相同。
public class Users {
    private int userid;
    private String username;
    private  String password;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

步骤二:在实用类中使用客户端的接口,调用对应的处理方法

该案例将该执行类定义为Demo1

由于方法几乎有重复的,因此当中有些代码是注释状态

package com.qf.test;

import com.qf.entity.Users;
import org.apache.cxf.jaxrs.client.WebClient;

import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;

public class Demo1 {
    public static void main(String[] args) {
 /*       //测试服务端的新增方法


        //创建服务端处理请求的方法中需要的参数
        Users users=new Users();
        users.setUserid(102);
        users.setUsername("我是客户端");
        users.setPassword("我是客户端");


        //http://localhost:8080/users/是服务器端发布的地址,后面的insert是你想调用的对应的处理方法的请求地址(该地址我们定义在服务端的接口中的),只有有请求地址才能找到对应的处理方法
        //post是restful中的新增的注解,即服务端接口请求地址下的post

        Response resp = WebClient.create("http://localhost:8080/users/insert").post(users);//users是请求地址对应的处理方法需要的参数,用post传过去
        //调用 Response的readEntity方法,获取服务端处理请求地址的方法的返回值
        Object entity = resp.readEntity(Integer.class);
        System.out.println(entity);//此时返回的是11
        */



        /* //测试删除方法
        //http://localhost:8080/users/是服务器端发布的地址,后面的delete是你想调用的对应的处理方法的请求地址(该地址我们定义在服务端的接口中的),为了调用对应方法
        Response resp = WebClient.create("http://localhost:8080/users/delete").path("/123").delete();//"/123"是接口请求地址那占位符要获取的值,也就是说用path传请求地址的参数,并赋给请求地址处理方法的参数的值
        //调用 Response的readEntity方法,获取服务端处理请求地址的方法的返回值
        Object entity = resp.readEntity(Integer.class);
        System.out.println(entity);
        */


  /*      //测试单行查询方法


        //由于控制台需要java代码,而不是json数据,因此在这里需要用accept方法转换成在后台能使用的
        Users users = WebClient.create("http://localhost:8080/users/getbyid/456")//http://localhost:8080/users/服务端发布的访问地址,getbyid是请求地址,456是发过去对应的参数,也是请求地址处理方法所需的参数。
                .accept(MediaType.APPLICATION_JSON_TYPE)//接受数据的类型,因为服务端请求地址处理方法的返回值是json格式,因此用accept的MediaType.APPLICATION_JSON_TYPE参数处理
                .get(Users.class);//接受返回的对象用get方法,Users是它返回过来的类型。
        System.out.println(users);//返回值为Users{userid=110, username='张三', password='abc'}
*/


         //测试多行查询,即服务端返回的是一个list集合
        List list = WebClient.create("http://localhost:8080/users/getall")//http://localhost:8080/users/服务端发布的访问地址,getall是请求地址
                .accept(MediaType.APPLICATION_JSON_TYPE)//接受数据的类型,因为服务端请求地址处理方法的返回值是json格式,因此用accept的MediaType.APPLICATION_JSON_TYPE参数处理
                .get(new GenericType>() {});//new GenericType<>(){}处理集合的固定方法,List是服务端请求地址对应的处理方法的返回值类型.这也是为什么我们要提前将服务端的Users实体类复制过来的原因。因为这里会用到
                System.out.println(list);//返回值为:[Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}]

    }
}


客户端结构图:
restful风格的webService之自定义客户端、服务端交互案例_第2张图片

你可能感兴趣的:(restful风格的webService之自定义客户端、服务端交互案例)