前言
本节内容我们主要介绍一下web访问的另一种形式,通过函数式web实现一个restful风格的http请求案例。函数式web是spring5.2之后的一个新特性,可以通过函数去定义web请求的处理流程,使得代码更为简洁,耦合性也降低了。
正文
- 函数式web的四大核心对象
- RouterFunction:定义路由信息
- RequestPredicates:定义请求规则,包括请求参数、请求方式等
- ServerRequest:封装请求参数
- ServerResponse:封装响应参数
- 定义一个函数式web的路由组件WebFunctionConfig配置类
- 实现代码
package com.yundi.isbc.config; import com.yundi.isbc.handler.PersonHandlerService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.web.servlet.function.RequestPredicates; import org.springframework.web.servlet.function.RouterFunction; import org.springframework.web.servlet.function.RouterFunctions; import org.springframework.web.servlet.function.ServerResponse; @Configuration public class WebFunctionConfig { /** * 用户信息管理 * * @param personHandlerService * @return */ @Bean public RouterFunction<ServerResponse> personRouter(PersonHandlerService personHandlerService) { RouterFunction<ServerResponse> personRouterFunction = RouterFunctions.route() .GET("/person/{id}", RequestPredicates.accept(MediaType.ALL), personHandlerService::getPerson) .GET("/persons", personHandlerService::getPersons) .POST("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandlerService::savePerson) .PUT("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandlerService::updatePerson) .DELETE("/person/{id}", personHandlerService::deletePerson) .build(); return personRouterFunction; } }
- 在该类中实现了restful风格的请求完成用户管理功能的开发
- 用户person对象的实体类
- 用户Person类
package com.yundi.isbc.entity; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import lombok.Data; import lombok.experimental.Accessors; import java.util.ArrayList; import java.util.List; @Accessors(chain = true) @Data public class Person { /** * id */ private String id; /** * 名称 */ private String name; /** * 年龄 */ private Integer age; /** * 手机号 */ private String phone; /** * 住址 */ private List<Address> addresses = new ArrayList<>(); }
- 用户地址类
package com.yundi.isbc.entity; import lombok.Data; import lombok.experimental.Accessors; @Accessors(chain = true) @Data public class Address { /** * 地址名称 */ private String addressName; }
- 定义业务实现接口PersonHandlerService
- 实现代码
package com.yundi.isbc.handler; import jakarta.servlet.ServletException; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; import java.io.IOException; public interface PersonHandlerService { /** * 根据id获取用户信息 * * @param serverRequest * @return */ ServerResponse getPerson(ServerRequest serverRequest); /** * 获取全部用户 * @param serverRequest * @return */ ServerResponse getPersons(ServerRequest serverRequest); /** * 保存用户 * @param serverRequest * @return */ ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException; /** * 更新用户信息 * @param serverRequest * @return */ ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException; /** * 删除用户 * @param serverRequest * @return */ ServerResponse deletePerson(ServerRequest serverRequest); }
- 定义各功能业务实现接口方法
- 定义业务实现类PersonHandlerServiceImpl
- 实现代码
package com.yundi.isbc.handler.impl; import com.yundi.isbc.entity.Address; import com.yundi.isbc.entity.Person; import com.yundi.isbc.handler.PersonHandlerService; import jakarta.servlet.ServletException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; import java.io.IOException; import java.util.Arrays; @Slf4j @Service public class PersonHandlerServiceImpl implements PersonHandlerService { @Override public ServerResponse getPerson(ServerRequest serverRequest) { log.info("==================获取用户信息=================="); String id = serverRequest.pathVariable("id"); log.info("用户id:{}", id); return ServerResponse .ok() .body(new Person() .setId("1") .setName("xiaoming") .setAge(18) .setPhone("18288474612") .setAddresses(Arrays.asList(new Address().setAddressName("北京市朝阳区")))); } @Override public ServerResponse getPersons(ServerRequest serverRequest) { log.info("==================获取全部用户信息=================="); return ServerResponse .ok() .body(Arrays.asList(new Person() .setId("1") .setName("xiaoming") .setAge(18) .setPhone("18288474612") .setAddresses(Arrays.asList(new Address().setAddressName("北京市朝阳区"))))); } @Override public ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException { log.info("==================保存用户信息=================="); Person person = serverRequest.body(Person.class); log.info("用户信息:{}", person); return ServerResponse.ok().build(); } @Override public ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException { log.info("==================更新用户信息=================="); Person person = serverRequest.body(Person.class); log.info("用户信息:{}", person); return ServerResponse.ok().build(); } @Override public ServerResponse deletePerson(ServerRequest serverRequest) { log.info("==================删除用户信息=================="); String id = serverRequest.pathVariable("id"); log.info("用户id:{}", id); return ServerResponse.ok().build(); } }
- 具体业务实现
- 启动项目访问测试
- 获取用户信息
- 获取用户全部信息
- 保存用户信息
- 更新用户信息
- 删除用户信息
结语
关于web新特性之函数式实现的相关内容到这里就结束了,我们下期见。。。。。。