为了账号安全,请及时绑定邮箱和手机立即绑定

DartVM服务器开发(第十一天)--Jaguar处理请求

标签:
JavaScript

1.方法请求

通过new 一个Jaguar对象,然后调用它封装好的方法处理请求,然后调用.serve()方法开启服务器

main()=>new Jaguar()   ..get('/api/doGet', (ctx) =>'Hello')   ..getJson('/api/doGetJson', (ctx)=>'{"id":3221}')   ..post('/api/doPost', (ctx) =>ctx.bodyAsJson())   ..postJson('/api/doPostJson', (ctx)=>'{"id":4234}')   ..delete('/api/doDelete', (ctx)=>'delete')   ..deleteJson('/api/doDelete', (ctx) =>'{"id":253}')   ..put('/api/doPut', (ctx)=>'put')   ..putJson('/api/doPutJson', (ctx)=>'{"id":2343}')   ..options('/api/doOptions', (ctx)=>'options')   ..patch('/api/doPatch', (ctx)=>'Patch')   ..html('api/doHtml', (ctx)=>'''<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body> Body </body> </html>''')   ..json('/api/doJson', (ctx)=>'{"id":123}')   ..serve(logRequests: true);

上面就是Jaguar处理请求的所有方法,我们来分析一下这些方法吧!

  • get/post/delete/put/options/patch

    • method=get/post/delete/put/options/patch

  • getJson/postJson/deleteJson/putJson

    • method=get/post/delete/put

    • headers.mimeType=MimeTypes.json 即应答头类型为application/json

  • html

    • method=get

    • headers.mimeType = MimeTypes.html 即应答头类型为text/html

  • json

    • method=get/post/pub/delete

    • headers.mimeType=MimeTypes.json 即应答头类型为application/json

OK 上面就是解释这些方法的接收请求方法跟返回的应答头

2.处理请求参数分析

我们再来分析一下一个方法里面的所有参数吧!

get(String path, RouteHandler handler,       {Map<String, String> pathRegEx,       ResponseProcessor responseProcessor,       List<RouteInterceptor> after,       List<RouteInterceptor> before,       List<ExceptionHandler> onException})

类型参数介绍
Stringpath请求的相对地址
RouteHandlehandle路由处理使用为(ctx){}这里含有一个Context(ctx)参数
Map<String, String>pathRegEx请求路径上使用正则例如:path:/:value/hello pathRegEx: {'value':r'^[0-9]*$'} 那么value必须是一个数字,否则不接收该请求
ResponseProcessorresponseProcessor应答处理,含有一个Response<dynamic>类型的参数
List<RouteInterceptor>before拦截器列表,在处理请求之前拦截
List<RouteInterceptor>after拦截器列表,在处理请求之后拦截
List<ExceptionHandler>onException异常处理列表,在请求发生异常时处理

使用:

..get('/api/doGet/:ls', (ctx) => 'Hello', pathRegEx: {         'ls': r'^[0-9]*$'       }, responseProcessor: (process){         print(process.statusCode);       },before: <RouteInterceptor>[         (ctx) {           print('before:${ctx.path}');         }       ], after: <RouteInterceptor>[         (ctx) {           print('after:${ctx.path}');         }       ], onException: <ExceptionHandler>[         (ctx, error, stack) {           print('异常信息:$error,堆栈:$stack');         }       ])

我们来请求一次吧:


   webp  请求.png

可以看到,我没有出现异常,按照正常的来走,先运行before后是responseProcessor,最后是after
那么我们制造一个异常看看有没有捕获到


   webp  页面输出.png
   webp  窗口.png
可以看到,我们的异常已经被捕获了,服务器也没有挂掉,上面的异常页面是默认的,可以看到哪里出错了

3.自定义异常

当异常发生时,如果你要自己定义异常,我们可以继承一个ErrorWriter抽象类,实现404页面跟500页面的自定义

class RhymeErrorWrite extends ErrorWriter{   @override   FutureOr<void> make404(Context ctx) {     //找不到页面时返回     final resp =     Response('''<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body> 404 </body> </html>''', statusCode: HttpStatus.notFound);     resp.headers.contentType = ContentType.html;     ctx.response = resp;   }   @override   FutureOr<void> make500(Context ctx, Object error, [StackTrace stack]) {     // 服务器出错返回     final resp =     Response('''<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body> 500 </body> </html>''', statusCode: HttpStatus.internalServerError);     resp.headers.contentType = ContentType.html;     ctx.response = resp;   } }

在这里也可以将异常信息写入到日志中,当然了,这个自定义肯定是满足不了大部分需求的,如果要查看更多可以看一下DefaultErrorWriter这个类
我们现在将这个自定义设置到服务器那里吧!

main() => new Jaguar(       errorWriter: new RhymeErrorWrite(),     )     ..get('/api/doGet/:ls', (ctx){         throw new Exception('发生异常');       }) //....

然后请求一下刚才出异常的页面


   webp  500.png
   webp  404.png

作者:rhyme_lph
链接:https://www.jianshu.com/p/fc3d422643c8


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消