REST(Representational State Transfer 表现层状态转化) 是一组架构约束,而不是协议或标准。通常定义:
- 每一个URI代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
一般实现了RESTful的架构更结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
二、Jersey框架Jersey是一个RESTful服务JAVA框架,与常规的JAVA编程使用的Struts框架类似,它主要用于处理业务逻辑层。Jersey是一个是 webservice框架。
通过简单的配置,即可打造极简主义的REST接口。其实就是可以把我们的服务层开放API供前端调用。
与SpringMVC的区别:
-
Jersey同样提供DI,是由glassfish hk2实现,也就是说,如果想单独使用Jersey一套,需要另外学习Bean容器;
-
MVC出发点即是WEB,但Jersey出发点确实RESTful,体现点在与接口的设计方面,如MVC返回复杂结构需要使用ModelAndView,而Jersey仅仅需要返回一个流或者文件句柄;
-
Jersey提供一种子资源的概念,这也是RESTful中提倡所有url都是资源;
-
Jersey直接提供application.wadl资源url说明;
-
MVC提供Session等状态管理,jersey没有,这个源自RESTFull设计无状态化;
-
Response方法支持更好返回结果,方便的返回Status,包括200,303,401,403;
-
提供超级特别方便的方式访问RESTful;
以下是demo案例:
maven引用:
org.springframework.boot spring-boot-starter-parent 2.3.4.RELEASE 4.0.0 jersey org.springframework.boot spring-boot-starter-jersey org.springframework.boot spring-boot-starter-web
Jersey配置,需要被Spring扫描到:
1、自定义资源配置类继承类ResourceConfig,通过register方法注册自己的资源。
2、在bean中新建资源配置类ResourceConfig,并返回此config。
注册我们的服务的时候有两种方式,一种是直接将类注册进去,一种是通过扫描包,建议是使用注册类的方式,比较好控制。如果服务非常多,使用包扫描的方式也可,自行定夺。
package org.self.zhlxf.config;
import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
import org.glassfish.jersey.server.ResourceConfig;
import org.self.zhlxf.service.impl.UserService;
import org.springframework.context.annotation.Configuration;
import javax.ws.rs.ApplicationPath;
@Configuration
@ApplicationPath("/") // 这里指定了路由的根路径,可自行配置,习惯用/
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
// 注册json解析
register(JacksonJsonProvider.class);
// 通过类名单个注册
register(UserService.class);
// 通过扫描包注册包里面的所有服务
// packages("org.self.zhlxf.service");
}
}
编写统一的返回对象:
package org.self.zhlxf.pojo; public class ApiResponseBody{ private Integer code; private T data; private String message; public ApiResponseBody() { } public ApiResponseBody(Integer code, T data, String message) { this.code = code; this.data = data; this.message = message; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public T getData() { return data; } public void setData(T data) { this.data = data; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return "ApiResponseBody{" + "code=" + code + ", data=" + data + ", message='" + message + ''' + '}'; } }
编写服务类:
package org.self.zhlxf.service;
import org.self.zhlxf.pojo.ApiResponseBody;
public interface IUserService {
ApiResponseBody allUser();
String getUserById();
}
package org.self.zhlxf.service.impl;
import org.jvnet.hk2.annotations.Service;
import org.self.zhlxf.pojo.ApiResponseBody;
import org.self.zhlxf.pojo.User;
import org.self.zhlxf.service.IUserService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.List;
@Service
@Path("/user")
public class UserService implements IUserService {
@GET
@Override
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public ApiResponseBody allUser() {
List ant = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ant.add(new User("小明" + i + "号", 5 + i));
}
return new ApiResponseBody(200, ant, "success");
}
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Override
public String getUserById() {
return "小明";
}
}
浏览器调用:localhost:8080/user
至此,一个基于jersey框架的RESTful简单demo就完毕了,更多的服务自行注册即可。



