DartVM服务器开发(第二天)--处理请求

上篇文章中,我们完成了第一个dart服务器,输出了Hello World!今天,我们来学习处理请求,获取请求方法,获取请求参数,获取请求头,那开始学习吧!

1. 处理请求

在上一节中,我们对所有请求都回复它一个Hello World!这个信息,我们现在改变一下,添加一个方法,传入request,把Hello World!这一条注释掉

  //....
  //监听请求
  await for(HttpRequest request in requestServer){

    //监听到请求后response回复它一个Hello World!然后关闭这个请求
//    request.response..write('Hello World!')
//      ..close();
    handleMessage(request);
  }
}
void handleMessage(HttpRequest request){
//在这个方法里面处理请求
}

一般情况下,我们是不知道别人要对我们服务器做什么的,如果服务器出现异常而崩溃掉,就会影响其它用户的访问,所以,我们需要try..catch里面处理请求,以防止客户端恶意请求

//....
void handleMessage(HttpRequest request){
  try{
    //在这里处理请求
  }catch(e){
    print('出现了一个异常,异常为:$e');
  }
  print('请求被处理了');
}

2. 请求方法

request这个对象里面,有一个method变量,这个变量就是请求的方法了,我们是可以通过request.method获取,请求方法有下面几种!

请求类型 含义
request.method=='GET' 当前为GET请求(一般为访问资源)
request.method=='POST' 当前为POST请求 (一般为提交数据)
request.method=='PUT' 当前为PUT请求(一般为特定位置上传资源)
request.method=='DELETE' 当前为DELETE请求(一般为删除资源)
request.method=='TRACE' 当前为TRACE请求(一般用于测试或诊断)
request.method=='CONNECT' 当前为CONNECT请求 (一般为代理服务)
request.method=='HEAD' 当前为HEAD请求 (一般获取响应消息头)
request.method=='OPTIONS' 当前为OPTIONS请求 (一般获取服务器支持的请求方法)

好了,我们知道了可以使用request.method来获取请求方法,那么对于一般服务器来说,只用到GET或者POST,所以,我们对不是GET或者POST的请求回应不支持该请求

void handleMessage(HttpRequest request){
  try{
    if(request.method=='GET'){
      //获取到GET请求
      handleGET(request);
    }else if(request.method=='POST'){
      //获取到POST请求
      handlePOST(request);
    }else{
      //其它的请求方法暂时不支持,回复它一个状态
      request.response..statusCode=HttpStatus.methodNotAllowed
          ..write('对不起,不支持${request.method}方法的请求!')
          ..close();
    }
  }catch(e){
    print('出现了一个异常,异常为:$e');
  }
  print('请求被处理了');
}

void handleGET(HttpRequest request){
  //处理GET请求
}
void handlePOST(HttpRequest request){
  //处理POST请求
}

上面我们看到了一个新的东西,就是request.response..statusCode ,这个变量呢,是对客户端返回一个状态码,我们熟悉的状态码有200(ok),404(链接不存在)等等,下面,我们学习一下dart内置的状态码有哪些(有同学可能会疑问,为什么使用“ .. ”而不是使用“ . ”呢,这个就是dart的一个语法,通过" .. " 我们可以不断的调用第一次“ .. ”的那个对象的方法,简直爱死这个操作有没有,有点语法糖的味道)

3. 状态码

HttpStatus这个类是一个抽象类,里面定义的一连串的状态码

abstract class HttpStatus {
//继续
  static const int continue_ = 100;
//交换协议
  static const int switchingProtocols = 101;
//可以
  static const int ok = 200;
//已创建
  static const int created = 201;
//认可的
  static const int accepted = 202;
//非授权信息
  static const int nonAuthoritativeInformation = 203;
//没有内容
  static const int noContent = 204;
//重置内容
  static const int resetContent = 205;
//部分内容
  static const int partialContent = 206;
//多项选择
  static const int multipleChoices = 300;
//永久迁移
  static const int movedPermanently = 301;
//已发现
  static const int found = 302;
//临时迁移
  static const int movedTemporarily = 302; // Common alias for found.
//查看其它
  static const int seeOther = 303;
//未修改的
  static const int notModified = 304;
//使用代理
  static const int useProxy = 305;
//暂时重定向
  static const int temporaryRedirect = 307;
//请求失败
  static const int badRequest = 400;
//没有授权
  static const int unauthorized = 401;
//要求付款
  static const int paymentRequired = 402;
//被禁止
  static const int forbidden = 403;
//未找到
  static const int notFound = 404;
//请求方法不允许
  static const int methodNotAllowed = 405;
//不接受
  static const int notAcceptable = 406;
//需要代理身份认证
  static const int proxyAuthenticationRequired = 407;
//请求超时
  static const int requestTimeout = 408;
//冲突
  static const int conflict = 409;
//过去了
  static const int gone = 410;
//长度要求
  static const int lengthRequired = 411;
//先决条件失败
  static const int preconditionFailed = 412;
//请求实体过大
  static const int requestEntityTooLarge = 413;
//请求地址过长
  static const int requestUriTooLong = 414;
//非支持的媒体类型
  static const int unsupportedMediaType = 415;
//请求范围不可满足
  static const int requestedRangeNotSatisfiable = 416;
//期望失败
  static const int expectationFailed = 417;
//升级要求
  static const int upgradeRequired = 426;
//内部服务器错误
  static const int internalServerError = 500;
//未实现
  static const int notImplemented = 501;
//网关坏了
  static const int badGateway = 502;
//服务不可用
  static const int serviceUnavailable = 503;
//网关超时
  static const int gatewayTimeout = 504;
//http版本不支持
  static const int httpVersionNotSupported = 505;
// 连接超时
  static const int networkConnectTimeoutError = 599;
}

4.获取请求的参数

当接收到请求时,客户端传递一个参数给我,我们应该怎样去获取呢?
这里我们需要用到 request.uri 这个变量,这个变量主要包含了请求的资源,例如:主机,地址,端口,查询字符串等等,那么现在,我们定义一个变量为id,当接收到这个id时,返回一个字符串为'当前查询的id为:$id'

void handleGET(HttpRequest request){
  //获取一个参数
  var id=request.uri.queryParameters['id'];//查询id的值
  request.response
  ..statusCode=HttpStatus.ok//回复它一个ok状态,说明我收到请求啦
  ..write('当前查询的id为$id')//显示到浏览器的内容
  ..close();//我已经回复你了,所以关闭这个请求
}

好了,我们按照之前的方法,启动服务器吧!然后到浏览器输入 http://localhost:8080?id=123
(这里因为是GET请求,所以,可以直接在链接上面传入查询参数,一般以 链接?key=value 的形式传入,key 对应为 id ,value对应为id的值,我们有不同的参数,就以 链接?key1=value1&key2=value2 这种形式传入)

传入id.png

可以看到,我们很成功的获取到id的值。

5.请求头

获取请求头,我们也是很容易就可以获取到的,可以通过
request.headers获取到

  request.headers.forEach((key,values){
    print('key:$key');
    for(String value in values){
      print('value:$value');
    }
  });

上面代码,可以打印出客户端请求的详细请求头


请求头返回的信息.png

今天我们学习了如何处理请求,获取请求方法,获取请求参数,获取请求头,好了,明天见!

如果想继续学习DartVM服务器开发,请关注我,学习更多骚操作!

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