WebService之CXF发布REST风格的服务

在上一篇博客 WebService之CXF快速入门(附Demo演示)讲述了CXF的基本概念,并且演示了如何编写WebService的服务端、客户端,在本篇博客将演示使用CXF发布REST风格的服务。

一、REST

1、REST是什么?

REST 是一种软件架构模式,是一种能对HTTP的利用实现精确的资源定位的风格。
举个栗子,如果不使用REST风格,常见的URL如下:

http://ip:port/queryUser.action?userType=student&id=001
http://ip:port/queryUser.action?userType=teacher&id=002

使用REST风格,则可以编写为如下URL:

http://ip:port/user/student/query/001
http://ip:port/user/teacher/query/001 

通俗的讲,REST风格就是将URL中的参数划分为URL中的层级。

: \color{red}注意:

RESTWebService-soapJAX-RS只是将REST设计风格应用到Web服务开发上。
Rest方式表示互联网上的资源更加准确,但是当目录的层级较多的时候,也存在不容易理解的缺点。

二、学生信息查询服务案例

发布查询学生信息的服务,以json和xml数据格式返回。
功能

1.通过ID查询一个学生信息服务
2.查询所有学生信息服务

1、创建一个普通java项目

在这里插入图片描述
在这里插入图片描述

2、导入CXF的jar包到项目lib文件夹

①、在项目中新建lib文件夹
在这里插入图片描述
在这里插入图片描述
②、复制CXF支持包中的jar包到项目lib文件夹下
在这里插入图片描述
③、将项目中的lib文件夹标记为项目Library
在这里插入图片描述
在这里插入图片描述

3、编写Student模型(还要设置注解)

package cn.hestyle.model;

/**
 * description: Student模型
 *
 * @author hestyle
 * @version 1.0
 * @className CXF Project 06 With REST->cn.hestyle.model.Student
 * @date 2019-12-11 09:33
 * 
 * 注意需要设置根节点,否者xml、json格式返回结果无法显示
 **/
@XmlRootElement(name = "student")
public class Student {
    private Integer id;
    private String name;
    private String age;
    private String gender;

    public Student() {
    }

    public Student(Integer id, String name, String age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "cn.hestyle.model.Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

4、编写服务接口、实现类

StudentService服务接口、注解

package cn.hestyle.service;

import cn.hestyle.model.Student;

import javax.jws.WebService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;

/**
 * description: 学生服务接口
 *
 * @author hestyle
 * @version 1.0
 * @className CXF Project 06 With REST->StudentService
 * @date 2019-12-11 09:38
 *
 * 设置为服务接口,并且REST的根目录为student
 **/
@WebService
@Path("student")
public interface StudentService {
    /**
     * 通过id查询学生信息
     * @param id 学生id
     * @return 学生信息
     *
     * 设置为get请求,返回数据格式为xml,子路径为/queryStu/{id}
     * id为url路径最后的参数,注入给方法中的id参数
     */
    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("/queryStu/{id}")
    public Student queryStu(@PathParam("id") int id);

    /**
     * 查询所有学生信息
     * @return  所有学生的信息list
     *
     * 设置为get请求,返回数据格式为json,子路径为/queryAllStu
     */
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/queryAllStu")
    public List<Student> queryAllStu();
}

StudentServiceImpl实现类

package cn.hestyle.service;

import cn.hestyle.model.Student;

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

/**
 * description: StudentService接口实现类
 *
 * @author hestyle
 * @version 1.0
 * @className CXF Project 06 With REST->StudentServiceImpl
 * @date 2019-12-11 09:41
 **/
public class StudentServiceImpl implements StudentService {
    @Override
    public Student queryStu(int id) {
        //为了简化操作,所以这里直接构造一个信息
        return new Student(id, "hestyle", "2020", "糙汉子");
    }

    @Override
    public List<Student> queryAllStu() {
        List<Student> students = new ArrayList<Student>();
        for (int id = 1; id < 4; ++id) {
            Student student = new Student(id, "hestyle" + id, "2020" + id, "糙汉子");
            students.add(student);
        }
        return students;
    }
}

5、发布服务

package cn.hestyle.test;

import cn.hestyle.service.StudentServiceImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;

/**
 * description: 测试服务发布
 *
 * @author hestyle
 * @version 1.0
 * @className CXF Project 06 With REST->Test01
 * @date 2019-12-11 09:52
 **/
public class Test01 {
    public static void main(String[] args) {
        JAXRSServerFactoryBean service = new JAXRSServerFactoryBean();
        //1、设置服务接口
        service.setResourceClasses(StudentServiceImpl.class);
        //2、设置服务实现
        service.setServiceBean(new StudentServiceImpl());
        //3、设置地址
        service.setAddress("http://127.0.0.1:12345");
        //4、发布服务
        service.create();
        
        System.out.println("学生信息发布成功,请在浏览器访问url:");
        System.out.println("http://127.0.0.1:12345/student/queryStu/学生id");
        System.out.println("http://127.0.0.1:12345/student/queryAllStu");
    }
}

然后再浏览器中访问上面的url,注意url必须与你设置的服务地址一致,如果你进行了修改!!
在这里插入图片描述
在这里插入图片描述

6、IDEA自带工具测试REST风格

在这里插入图片描述
在这里插入图片描述
这个工具在2019.2.3版中有,在旧版就不知道了。

发布了976 篇原创文章 · 获赞 230 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/103486401