(三)springboot实战——web新特性之函数式实现

前言

本节内容我们主要介绍一下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新特性之函数式实现的相关内容到这里就结束了,我们下期见。。。。。。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厉害哥哥吖

您的支持是我创作下去的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值