昨天我们实现了token
相关的内容,今天我们开始来写路由。
项目地址:
由于我是先实现完再写的这篇文章,如果有些地方无法运行,可以看下我项目里的代码。
目前我还在往全栈的方向学习,所以如果看的不顺眼,请多多包涵。如果觉得那里可以改进,麻烦评论区说下,谢谢~
第一步自然是实现注册的路由,回到我们的auth
文件夹中,新建route.rs
文件
这个是整体框架,我们需要用到db
,所以这里需要引入,另外我们还需要数据类型,这里发送类型是POST
,所以我创建了一个新的类型RegisterData
,放在auth/mod.rs
中
我们直接derive
一个FromForm
[1]即可。
其中field
里面的name
指的是POST
传过来的数据里的form
字段名字
另外我们再实现一个枚举类型,用于组装RtData
作为response
(实际上可以和前面实现的DataType
放到一起,我这里写的时候还没这个想法,所以是分开的)
这里还有一步set_token
,这个函数我们在上篇文章中实现了,注册之后就没必要让用户再去登录了,直接就给他token
即可。
然后回到我们的路由这里,我们来填充逻辑,我们需要实现以下部分:
validate_register_data
:这个我们还没实现,用来校验数据是否正确的,比如email
格式等try_register_user
:这个也还没实现,我们准备在这个函数中和数据库对接,执行SQL
语句。我们先来实现try_register_user
,在auth
文件夹下创建一个db_service
文件,这个文件不用在mod.rs
中pub
出去,只需要引入即可,只在route.rs
中使用。
这里的逻辑很简单,先通过SELECT
语句查询是否已经被注册了,如果没有再执行INSERT
逻辑。
至于SQL
语句我这里就不多说了
注意:这里如果是字符串,你需要加上''
,不然就无法通过解析。
然后我们再来实现validate
这块。
我们在auth
文件夹下创建一个validate.rs
文件
代码稍微有些长,但是很好理解,就是用来校验数据的。
这里用到了Regex
的正则表达式,它来自于我们前面引入的regex
[4]这个crate
这个validate
在登录和注册都需要使用到,所以我还是把它放到全局state
去了,在state/mod.rs
中
然后别忘了在main.rs
中引入
那么这一块就完成了。
完整的register
代码
第一步我们显示校验数据,错误直接去400
。
然后我们在query
邮箱/手机号是否已被注册,是的话返回success:false
。
如果没有被注册就帮他注册,如果注册过程中发生问题,则返回500
。
最后我们在给RegisterData
实现的Responder
中插入token
到header
中,那么这个路由就完成了。
最后别忘了在main.rs
中引入
官方提供了我们单元测试和集成测试的场景,但是我这里还是不这么做了。就我个人而言,写一些公共库/组件的时候用集成测试和单元测试确实会比较好一些,但是对于业务来说,这种反而作用不大。
所以我还是走传统的方式,通过第三方工具来测试接口。
我这里选择的是ApiFox
的谷歌/edge
浏览器插件:Apifox Browser Extension - Microsoft Edge Addons
我偶然发现的,本来打算看下有没有postman
的,结果看到了这个。
试了下发现挺不错的,数据是远程的,也就是说换台电脑依旧是这些接口,非常方便。
我这里简单的测试下即可,其它几种场景我开发的时候已经测试过了。
这里的user_id
忘了去掉了。。。。。
这个时候我们在header
里就能拿到token
了。
别忘了配置开发环境的基础路径
登录的逻辑和注册的差不多。
我们先去type/mod.rs
中新增一个类型
我们在这里插入token
,并且将is_valid_token
置为true
,这样避免fairing
那边on_reponse
造成的误伤。
这里我还做了对user_id
的数据隐藏,register
是之前写的,忘了加上了。。。
row.get::
:由于我们数据库那边id
是uuid
类型的,所以拿出来的也是uuid
,而我们传给前端的id
是String
的,如果不做转换在runtime
的时候就会有问题。这里逻辑很简单,直接根据email/phone
+ 密码来查询是否存在对应信息,没有直接返回Status
400
扔到捕获器那边处理。
查询过程中发生了问题,这就属于服务器内部出错,这个时候走500
的场景。
我们回到auth/db_service.rs
里面实现这个get_user_msg
注意这里做了加密处理,因为我们注册的时候插入到数据库里的密码是md5
之后的了,所以这里也需要md5
加密下。
最后别忘了在main.rs
中注册
这个是我们刚注册的用户,可以看到登录成功了。
token
也有正常拿到
至于logout
就不在这实现了,由前端移除_token
即可。
而注销我这偷懒觉得没必要,你也可以自己实现一个。
下一章我们来实现文章的增删改查
发布于 2023-06-07 18:01・IP 属地广东