MKNetworkit,Express实现简单登录验证(1)-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

MKNetworkit,Express实现简单登录验证(1)

简介: 首先Express实现一个简单的http服务器,支持get,post请求: var express = require('express'); var url = require('url'); var query=require('querystring'); var app =express(); app.listen(3000); app.all('/login

首先Express实现一个简单的http服务器,支持get,post请求:

var express = require('express');
var url = require('url');
var query=require('querystring');
var app =express();
app.listen(3000);

app.all('/login',function(req,res){
   //获取url的字面对象格式
   var jsonurl = url.parse(req.url,true);
   var jsonobj = jsonurl.query;
   var rescode = 'fasle';

   if (req.method=="GET"){
      console.log("Query:\t"+JSON.stringify(jsonobj)); //查询字段的json字符串格式,并非对象格式
      if(jsonobj.user=='tyrant' && jsonobj.password=='123'){
         rescode = 'true';
           }
   var result ={
      'user':jsonobj.user,
      'password':jsonobj.password,
      'resultcode':rescode
   }
   res.send(JSON.stringify(result));

   }
  else{

    var postdata = '';
    req.on("data",function(chunck){
        postdata+=chunck;
    });
    req.on("end",function(){
      var params = query.parse(postdata);//字符转化为数组对象
       if(params['user']=='xiaozhun' && params['password']=='123'){
           rescode = 'true';
            var result ={
           'user':params['user'],
           'password':params['password'],
           'resultcode':rescode
                    }
      res.send(JSON.stringify(result));
    }});
  }


});



注意两点:

  • 注意格式转换,其中三处格式转化:

    1. var jsonurl = url.parse(req.url,true);
      这是调用nodejs的url模块实现,对url格式字符串的对象化

    2. var jsonobj = jsonurl.query;JSON.stringify(req.query)
      这是从url对象中提取query字段,就是url后面”?”后的部分,这里提取出来的就是js的对象,JSON.stringify()就是将js对象转化为字符串。

    3. query.parse(postdata);
      这是nodejs模块querystring的功能,将键值对集合的字符串转化为js的数组对象,具体函数申明如下:

      querystring.parse(str, [sep], [eq], [options])
      //sep为分隔符,默认为& , eq为赋值符号,默认为=,option为能转化字符串的最大长度,默认为1000
      
  • get和post的数据处理方式不同,get可简单从url中获取字段,post数据量较大,只能通过事件监听,分别监听”data”,”end”事件,获取post中的数据。

前端,网络通信采用MKNeworkit,直接上代码:分别是post和get方式传递用户名密码


-(void)loginPost:(NSString*)user pass:(NSString*)password{
    MKNetworkEngine * engine = [[MKNetworkEngine alloc]initWithHostName:@"127.0.0.1:3000" customHeaderFields:nil];

    NSMutableDictionary* params = [[NSMutableDictionary alloc]init];
    [params setValue:user forKey:@"user"];
    [params setValue:password forKey:@"password"];

    MKNetworkOperation * op = [engine operationWithPath:@"/login?" params:params httpMethod:@"POST"];
    NSLog(@"url:%@",[op url]);

    [op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        NSData* data = [completedOperation responseData];
        NSError* err = nil;
        NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];
        if(dict&&(err==nil)){
            NSLog(@"success 返回结果:%@",dict);

        }else{
            NSLog(@"failed 返回结果:%@",dict);
        }
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        NSLog(@"error:%@",[error localizedDescription]);
    }];

    [engine enqueueOperation:op];

}
-(void)loginGet:(NSString*)user pass:(NSString*)password{
    NSString* path = [[NSString alloc]initWithFormat:@"login?user=%@&password=%@",user,password];

    MKNetworkEngine *engine = [[MKNetworkEngine alloc]initWithHostName:@"127.0.0.1:3000" customHeaderFields:nil];
    MKNetworkOperation *op = [engine operationWithPath:path params:nil httpMethod:@"GET"];

    [op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        NSData* data = [completedOperation responseData];
        NSError* err = nil;
        NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];
        if(dict&&(err==nil)){
            NSLog(@"success 返回结果:%@",dict);

        }else{
            NSLog(@"failed 返回结果:%@",dict);
        }

    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        NSLog(@"error:%@",[error localizedDescription]);
    }];

    [engine enqueueOperation:op];
}

MKNetworkit主要就是两个类,MKNetworkEngine,MKNetworkOperation,一个负责管理链接队列,包括指定host,生成链接,一个负责链接的具体内容,从最后的[engine enqueueOperation:op]; 可见采用的是任务队列。中间有个json数据的转化,因为服务器返回的是json格式的数据。

具体工程参见:
https://github.com/tyrantkemp/mknetwork_express.git

这样能模拟出登陆验证的功能,但是在具体实现中发现一个问题,就是登陆时客户端和服务器通信同步异步问题,具体见下一章

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章