当前位置:网站首页>25:第三章:开发通行证服务:8:【注册/登录】接口:接收并校验“手机号和验证码”参数;(重点需要知道【利用redis来暂存数据,获取数据的】的应用场景)(使用到了【@Valid注解】参数校验)

25:第三章:开发通行证服务:8:【注册/登录】接口:接收并校验“手机号和验证码”参数;(重点需要知道【利用redis来暂存数据,获取数据的】的应用场景)(使用到了【@Valid注解】参数校验)

2022-06-30 19:33:00 小枯林

说明:

(1)本篇博客内容:开始开发【一键注册/登录】接口;

          ● 然后,本篇博客开发的部分是:用户在点击【一键注册/登录】按钮后,后端会校验【用户是否输入了手机号或验证码】、【用户输入的验证码是否匹配】;

(2)本篇博客的需要注意的点:

          ● 创建了BO实体类,去承接前端表单提交的数据;

          ● 使用了【@Valid注解】参数校验;

          ● 一些公用的方法,可以定义在【imooc-news-dev-service-api】接口工程的BaseController类中;

          ● 注意一下参数校验的整体流程;

目录

1.在【imooc-news-dev-service-api】接口工程的PassportControllerApi接口中,定义【注册/登录】接口;

2.在【imooc-news-dev-service-user】用户微服务的PassportController类中,实现【注册/登录】接口;

3.效果;


1.在【imooc-news-dev-service-api】接口工程的PassportControllerApi接口中,定义【注册/登录】接口;

    /**
     * 【一键注册/登录,接口】
     * @param registLoginBo
     * @param result
     * @return
     */
    @ApiOperation(value = "一键注册/登录接口", notes = "一键注册/登录接口", httpMethod = "POST")
    //前端那边的请求接口已经是“getSMSCode”了,所以自己在写后端接口的url的时候,别瞎写;
    @PostMapping("/doLogin")
    public GraceJSONResult doLogin(@RequestBody @Valid RegistLoginBo registLoginBo,
                                   BindingResult result);

说明:

(1)接口请求方式是POST,因为前端其实是一个表单,而对应表单提交一般都使用POST方式;

(2)一般来说,接收表单数据的时候,我们可以使用对象去承接参数;

          ● 所以我们在【imooc-news-dev-model】模型工程中,创建bo包,创建RegistLoginBo实体类;(BO的意思是,从页面视图层传过来的对象,也可以理解为是Bussiness Object)(在本项目中,BO实体类是前端传给后端的,VO实体类是后端传给前端的)

package com.imooc.bo;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * BO实体类:承接【一键注册/登录】接口的参数;
 */
public class RegistLoginBo {

    @NotBlank(message = "手机号不能为空")
    private String mobile;
    @NotBlank(message = "短信验证码不能为空")
    private String smsCode;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getSmsCode() {
        return smsCode;
    }

    public void setSmsCode(String smsCode) {
        this.smsCode = smsCode;
    }

    @Override
    public String toString() {
        return "RegistLoginBo{" +
                "mobile='" + mobile + '\'' +
                ", smsCode='" + smsCode + '\'' +
                '}';
    }
}

          ● 这儿使用到了【@Valid注解】参数校验;可以参考【Spring Boot电商项目24:商品分类模块三:使用【@Valid注解】校验入参;】;

          ● 其中【@NotNull】注解,只能校验完全为空的情况,如果前端输入一个如【"    "】的空字符串,该注解是校验不了的;;;而【@NotBlank】注解不仅可以校验完全为空的情况,也可以校验如【"    "】的空字符串;

          ● 然后,记得在接口的RegistLoginBo参数那儿,要使用【@Valid】注解,以开启参数校验;

          ● 如果我们在实体类上使用lombok的注解后,就可以省略get和set方法等;;;但是,很多公司是不建议使用lombok的(因为其在与某些第三方库结合的时候,可能会有一些小bug)

          ● 然后,如果我们使用bean去接收参数的时候,需要使用【@RequestBody】注解;;;这个注解的主要意思是【前端传过来的JSON】和【后面的RegistLoginBo registLoginBo】是对应的,以便承接参数;

          ● 一旦校验失败,有错误信息后,我们就可以通过【BindingResult result】来获取对应的错误信息;所以,这儿在参数中,也引入了【BindingResult result】;

          ● 这儿的内容,以前遇到过N次,也不是特别复杂,就不过多赘述了;

2.在【imooc-news-dev-service-user】用户微服务的PassportController类中,实现【注册/登录】接口;

 /**
     * 【一键注册/登录,接口】
     * @param registLoginBo
     * @param result
     * @return
     */
    @Override
    public GraceJSONResult doLogin(@Valid RegistLoginBo registLoginBo, BindingResult result) {
        //0.判断BindingResult中是否保存了验证失败的错误信息,如果有,说明前端的输入是有问题的(手机号或者验证码,至少有一个没输入);
        // 那么,我们就获取这个错误信息,并构建一个GraceJSONResult统一返回对象,返回;
        if (result.hasErrors()) {
            Map<String, String> map = getErrorsFromBindingResult(result);
            return GraceJSONResult.errorMap(map);
        }
        //1.校验验证码是否匹配;
        //1.1 获取用户在前端输入的手机号和验证码;
        String mobile = registLoginBo.getMobile();
        String smsCode = registLoginBo.getSmsCode();
        //1.2 根据用户在前端输入的手机号,尝试去redis中获取对应的验证码;
        String redisSMSCode = redisOperator.get(MOBILE_SMSCODE + ":" + mobile);
        //1.3如果前端输入的验证码,在redis中不存在(说明:我们并没有针对【用户输入的这个手机号码】发送过验证码;
        // 或者说是用户在收到验证码短信后,过了30min后才使用,redis中存的验证码过期失效了),
        // 或者前端输入的验证码和redis中的不一样(说明:用户的验证码输错了);
        // 那么,就返回对应的,包含错误信息的GraceJSONResult统一返回对象;
        // 其中,这儿我们利用【org.apache.commons.lang3】中的StringUtils工具类的isBlank()方法来判空;
        if (StringUtils.isBlank(redisSMSCode) || !redisSMSCode.equals(smsCode)) {
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
        }

        return GraceJSONResult.ok();
    }

说明:

(1)判断【参数校验】是否OK;

          ● 我们在【imooc-news-dev-service-api】接口工程的BaseController中,定义了一个方法getErrorsFromBindingResult():从BindingResult中提取错误信息;(这个方法,以后在其他地方,也会被用到)

(2)校验验证码是否匹配;

          ● 说明1;

          ● 说明2;

3.效果;

(1)全局install一下整个项目;

(2)启动【imooc-news-dev-service-usr】用户微服务的主启动类;

(3)我们在【http://localhost:8003/doc.html】Swagger2的页面上,去测试接口了;

          ● 失败的情况;

          ● OK的情况;

原网站

版权声明
本文为[小枯林]所创,转载请带上原文链接,感谢
https://wgy-coder.blog.csdn.net/article/details/125538639