前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart-Aqueduct框架开发(四)

Dart-Aqueduct框架开发(四)

作者头像
rhyme_lph
发布2019-09-20 16:55:44
8030
发布2019-09-20 16:55:44
举报
文章被收录于专栏:Flutter&DartFlutter&Dart

上一篇

声明:本文首发于微信订阅号:Dart客栈 文章为原创,如需转载请注明出处,并告知作者,谢谢!

1.介绍

这篇文章将详细介绍URL路由,前几篇有小伙伴私信留言说讲得有点快,感觉跟不上,所以,接下来的文章中,将详细介绍Aqueduct的相关内容.

2.什么是URL?

每个http请求都有一个URl,可以作为客户端访问服务器的一个访问路径,例如:http://xxxx.com/image/xxx.jpg,当客户端请求该路径地址时,服务端将返回对应的图片资源给客户端,URL是Web应用程序提供的,客户端可以通过web应用程序提供的URL来操作web应用程序的资源,例如:数据库中的数据增删改和查询,文件的创建和删除等

3.URL的组成

URL由许多部分组成,其中一部分是可选的,例如https://www.baidu.com/index.html,当浏览器访问这个URL时,将显示百度的index.html页面,这个页面包含三个必要组件:scheme(https)host(www.baidu.com)path(/index.html),其中,path是可选的而且可以是多个,并且**Aqueduct**框架只关心**path**,也就是**Aqueduct**中的访问路由

4.匹配路由

如上一节的代码中:

代码语言:javascript
复制
  @override
  Controller get entryPoint {
    //定义路由、请求链接等,在启动期间调用
    router.route('/queryArticle').linkFunction((request) async{
      final query = Query<Article>(context);
      final List<Article> articles=await query.fetch();
      return Response.ok(articles);

    });
    return router;
  }

当客户端访问的path/queryArticle时,将会匹配到路由,并获取到代码中Response.ok里面参数的内容,path可以有多段,路由路径规范为每个段与请求的每个段相匹配,每个段的数量也必须相同,才能访问到,下面是一个反面例子:/queryArticle/1,这个路径将访问不了上面的资源

路由路径上的变量/:id

路径规范中,可以拥有变量,最经常用于获取唯一标识的资源,例如:/queryArticle/1,/queryArticle/2,通常的,我们以:冒号开头的path作为变量,添加如下代码,根据id访问文章

代码语言:javascript
复制
```dart

@override

Controller get entryPoint {

代码语言:txt
复制
//定义路由、请求链接等,在启动期间调用
代码语言:txt
复制
router.route('/queryArticle/:id').linkFunction((request) async {
代码语言:txt
复制
  final id = request.path.variables['id']; //获取路径上的id变量
代码语言:txt
复制
  if (int.tryParse(id) != null) {//判断是否为int类型
代码语言:txt
复制
    final query = Query<Article>(context)
代码语言:txt
复制
      ..where((a) => a.id).equalTo(int.parse(id));//查询id对应的文章
代码语言:txt
复制
    final articles = await query.fetchOne();//查询第一条
代码语言:txt
复制
    if(articles!=null){ //判断是否存在
代码语言:txt
复制
      return Response.ok(articles); //查询成功,返回文章
代码语言:txt
复制
    }else{
代码语言:txt
复制
      return Response.ok({"msg":"no exist"});//不存在该文章
代码语言:txt
复制
    }
代码语言:txt
复制
  }else{
代码语言:txt
复制
    return Response.badRequest(body:{"msg":"error"});//查询失败,id不是int类型
代码语言:txt
复制
  }
代码语言:txt
复制
});
代码语言:txt
复制
return router;

}

代码语言:txt
复制
在启动服务器之前,我们插入几条数据到数据库中

![请在此添加图片描述](https://ask.qcloudimg.com/http-save/yehe-1560223/92c2xfzxrp.png?qc_blockWidth=523&qc_blockHeight=112)

然后访问

![请在此添加图片描述](https://ask.qcloudimg.com/http-save/yehe-1560223/p5glgjgpzt.png?qc_blockWidth=832&qc_blockHeight=202)

![请在此添加图片描述](https://ask.qcloudimg.com/http-save/yehe-1560223/g3rov8n9l6.png?qc_blockWidth=817&qc_blockHeight=204)

![请在此添加图片描述](https://ask.qcloudimg.com/http-save/yehe-1560223/9fuztyvvoy.png?qc_blockWidth=430&qc_blockHeight=144)

![请在此添加图片描述](https://ask.qcloudimg.com/http-save/yehe-1560223/e91qeswc6g.png?qc_blockWidth=425&qc_blockHeight=137)

?很棒!程序都按照我们的预想成功了

### 可选路径变量`/[:id]`或`[/:id]` 

当前,我们的路径在访问文章的时候,我们之前已经有一个访问路径了,现在我们又加了一个,等于代码冗余了,这不是我们想看到的,那么这个时候,可以使用可选路径,当存在`id`的时候,就去访问对应的id,当不存在id时,我们就查询所有文章,所以,将之前的代码合并到`/queryArticle`路径来,使用`中括号`把`:id`括起来,说明这个是可选变量,代码如下:

```javascript

@override

Controller get entryPoint {

代码语言:txt
复制
//可选变量[:id]
代码语言:txt
复制
router.route('/queryArticle/[:id]').linkFunction((request) async { 
代码语言:txt
复制
  final id = request.path.variables['id'];
代码语言:txt
复制
  if(id==null){
代码语言:txt
复制
    final query = Query<Article>(context);
代码语言:txt
复制
    final List<Article> articles = await query.fetch();
代码语言:txt
复制
    return Response.ok(articles);
代码语言:txt
复制
  }else if (int.tryParse(id) != null) {
代码语言:txt
复制
    final query = Query<Article>(context)
代码语言:txt
复制
      ..where((a) => a.id).equalTo(int.parse(id));
代码语言:txt
复制
    final articles = await query.fetchOne();
代码语言:txt
复制
    if(articles!=null){
代码语言:txt
复制
      return Response.ok(articles);
代码语言:txt
复制
    }else{
代码语言:txt
复制
      return Response.ok({"msg":"no exist"});
代码语言:txt
复制
    }
代码语言:txt
复制
  }else{
代码语言:txt
复制
    return Response.badRequest(body:{"msg":"error"});
代码语言:txt
复制
  }
代码语言:txt
复制
});
代码语言:txt
复制
return router;

}

代码语言:txt
复制
这样就可以实现了,感兴趣的小伙伴可以运行一下,这里就不一一展示了,路径规范中,可以包含多个可选路径变量,例如:`/a/[b/[:c]]`将匹配`/a`、`/a/b`、`a/b/c`,不匹配`/a/c`

### 限制路径变量(可使用正则表达式)`/:id([0-9]+)` 

一般的,我们可以使用变量后接括号,把正则表达式括起来`/:变量(正则表达式)`,让我们限制一下上面请求的id只能为整数,不匹配将返回`404`,然后代码判断部分就可以直接去掉

```javascript

@override

Controller get entryPoint {

代码语言:txt
复制
//正则限制变量/:变量(正则)
代码语言:txt
复制
router.route('/queryArticle/[:id([0-9]+)]').linkFunction((request) async { 
代码语言:txt
复制
  final id = request.path.variables['id'];
代码语言:txt
复制
  if(id==null){
代码语言:txt
复制
    final query = Query<Article>(context);
代码语言:txt
复制
    final List<Article> articles = await query.fetch();
代码语言:txt
复制
    return Response.ok(articles);
代码语言:txt
复制
  }else{
代码语言:txt
复制
    final query = Query<Article>(context)
代码语言:txt
复制
      ..where((a) => a.id).equalTo(int.parse(id));
代码语言:txt
复制
    final articles = await query.fetchOne();
代码语言:txt
复制
    if(articles!=null){
代码语言:txt
复制
      return Response.ok(articles);
代码语言:txt
复制
    }else{
代码语言:txt
复制
      return Response.ok({"msg":"no exist"});
代码语言:txt
复制
    }
代码语言:txt
复制
  }
代码语言:txt
复制
});
代码语言:txt
复制
return router;

}

代码语言:txt
复制
### 匹配路径下的所有路径`/*` 

当我们需要做一系列的匹配时,我们可以在路径的最后一段加上`/*`,例如:`/user/*`,当请求`/user/12`或者`/user/12/34`等,都将匹配,一般用于一个大系的URL路由处理

### 404的处理

一般我们的`web`服务器都需要对404做定制处理,下面是自带的`404`页面
 

![请在此添加图片描述](https://ask.qcloudimg.com/http-save/yehe-1560223/i5ccfjnfc8.png?qc_blockWidth=977&qc_blockHeight=567)

 这样的页面肯定不能满足我们的请求要求,所以需要定制,定制也很简单,`Aqueduct`框架为我们在构造路由时,特意留下一个参数设置`404`页面,因为我的是`API`服务器,所以返回一个`json`

```javascript

@override

Controller get entryPoint {

//edit

代码语言:txt
复制
final router = Router(notFoundHandler: (request) async {
代码语言:txt
复制
  Response response=Response.notFound();//404的状态码
代码语言:txt
复制
  response.contentType=ContentType.json;//内容类型
代码语言:txt
复制
  response.body={'code': -1, 'msg': '404'};//内容
代码语言:txt
复制
  await request.respond(response);//把内容相应出去
代码语言:txt
复制
  logger.info("${request.toDebugString()}");//打印日志
代码语言:txt
复制
}); //路由对象

//edit

代码语言:txt
复制
return router;

}

代码语言:txt
复制

然后再请求404就会看到对应的内容

以上就是这一节的所有内容,如果小伙伴们觉得有收获,不妨点一下再看,让我能看到你跟我一起学习Dart服务器,也是对我写作的一种肯定?!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.09.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.介绍
  • 2.什么是URL?
  • 3.URL的组成
  • 4.匹配路由
    • 路由路径上的变量/:id
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档