前言
上次留了一些问题,现在我们来解决一下。
- 对请求时的反序列化异常进行处理
- 带条件参数的查询接口
本文完整源码见GITHUB Repo: https://github.com/nintha/demo-myblog
对请求时的反序列化异常进行处理
问题复现:
我们构造一个这样的请求,body里面的JSON字符串比正常少了一个content
字段
1 | POST /articles |
响应内容:1
Json deserialize error: trailing comma at line 5 column 1
这是普通文本,我们需要把这个错误信息捕获并转换为统一的错误格式
在 main
函数里面修改
1 | // main.rs |
这里调用了.data(..)
方法,对JSON反序列化的异常进行自定义处理,对于原始错误信息使用日志进行打印,对于前端返回内容,则是用我们自定义错误信息
1 | { |
带条件参数的查询接口
首先我们声明一个新的结构体,用来承载查询条件参数
1 | // article/mod.rs |
_id
用于精确匹配,keyword
用于模糊匹配title/author/content
字段内容。
由于这些参数是可选的,所以_id
用Option
包一层,keyword
是字符串,可以直接用默认值进行处理。Option
的默认值是None
,String
的默认值是空字符串。
ObjectId
默认的反序列化肯定是不好用的,我们希望用户传递一个字符串就可以了,所以需要对_id
字段指定自定义反序列化函数。反序列化函数如下所示:
1 | // article/mod.rs |
然后就可以使用这个定义好的结构体了,把之前的查询接口函数
1 | pub fn list_article() -> SimpleResp { |
改成
1 | pub fn list_article(query: web::Json<ArticleQuery>) -> SimpleResp { |
这里我们先判断下每个参数是否有传递上来,对于没有的参数进行忽略。模糊匹配这里使用了大小写不敏感正则匹配,为了覆盖多个字段,则是用了mongodb
提供的$or
逻辑操作符。
测试下效果,这里使用了带 body的GET请求,首先是空参数
1 | GET /articles |
响应内容:
1 | { |
带上_id
参数的请求
1 | GET /articles |
响应内容:
1 | { |
带上keyword
参数的请求
1 | GET /articles |
响应内容:
1 | { |
后记
这次我们解决了上次遗留下来的一部分问题。很多时候解决一个问题会引发另一个问题,比如为了模糊查询,我们这里使用了正则匹配+$or
来实现的,可能在数据量比较大的时候性能表现并不理想,到时候要考虑是否替换成全文检索进行实现。
下一篇应该快了 (咕咕)。