Dart-Aqueduct框架开发(四)

上一篇

声明:本文首发于微信订阅号:Dart客栈,微信后台回复05164获取本篇源码
文章为原创,如需转载请注明出处,并告知作者,谢谢!

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.匹配路由

如上一节的代码中:

  @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访问文章

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

在启动服务器之前,我们插入几条数据到数据库中



然后访问





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

可选路径变量/[:id][/:id]

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

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

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

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

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

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

匹配路径下的所有路径/*

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

404的处理

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


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

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

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

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

下一篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342