除了使用webapi外, Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,具体详细,可以百度。
注意事项
1.所有 api 写在Models下面
2.引入 Nancy 库 我的是.net 4.5的 所以选的版本是 1.4.1的
引入成功后在 web.config会自动新增配置节点
基本配置搞完后在具体实现
1.新建基类api BaseApi
using Nancy;
using Nancy.ModelBinding;
using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.Linq;
using System.Web;
using 小鱼_SysEntity;
using 小鱼_api.Utils;namespace 小鱼_api.Models
{/// <summary>/// 基类api/// </summary>public class BaseApi : NancyModule{#region 构造函数public BaseApi(): base(){Before += BeforeRequest; //前置拦截器OnError += OnErroe; //api 报错执行After += AfterResponse;//后置拦截器 可以在这里修改或替换当前的Response}public BaseApi(string baseUrl): base(baseUrl){Before += BeforeRequest;OnError += OnErroe;After += AfterResponse;}#endregion 构造函数#region Nancy 前置,后置,错误 拦截/// <summary>/// 前置拦截器/// </summary>/// <param name="ctx"></param>/// <returns></returns>private Response BeforeRequest(NancyContext ctx){ //登录有效验证return null;}/// <summary>/// 请求后置拦截器 || 压缩数据/// </summary>/// <param name="ctx"></param>private void AfterResponse(NancyContext ctx){#region 压缩数据HttpResponse response = HttpContext.Current.Response;string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];if (!string.IsNullOrWhiteSpace(AcceptEncoding)){var headers = response.Headers.AllKeys;/***在调用工具类的时候 比如下载文件,实际已经在工具类响应了,如果在次添加 压缩请求头信息会提示 重复添加头信息错误提示*在postmain调试下可以看到效果**/if (!headers.Contains("Content-Type")){if (AcceptEncoding.Contains("deflate")){response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);response.AppendHeader("Content-Encoding", "deflate");}else{response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);response.AppendHeader("Content-Encoding", "gzip");}}}#endregion 压缩数据}/// <summary>/// 监听接口异常/// </summary>/// <param name="ctx">连接上下信息</param>/// <param name="ex">异常信息</param>/// <returns></returns>private Response OnErroe(NancyContext ctx, Exception ex){return Response.AsText("");}#endregion Nancy 前置,后置,错误 拦截//还以 统一 请求参数 及响应参数。}
}
2.新建业务api 继承 BaseApi
using Nancy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using 小鱼_SysEntity;
using 小鱼_api.Service;namespace 小鱼_api.Models
{/// <summary>/// 用户api/// </summary>public class UserApi : BaseApi{public UserApi() : base("/user"){Post["login"] = Login;//用户登录}private readonly UserService userService = new UserService();public Response Login(dynamic _){var loginModel = this.GetReqData<LoginModel>();var userInfo = userService.CheckLogin(loginModel.username, loginModel.password);if (userInfo == null){return Fail("用户名或密码错误");}return Success(userInfo);}public class LoginModel{/// <summary>/// 账号/// </summary>public string username { get; set; }/// <summary>/// 密码/// </summary>public string password { get; set; }}}
}
讲解,以上代码 只是提供思路
1.在BaseApi, 定义统一api 的 响应参数模板 例如返回数据格式{code:200,info:"响应成功",data:响应数据 };
2.在BaseApi, 定义统一api 的 请求参数模板 例如 {token:XXXX,data:{obj}};(每次请求携带服务器密钥,可以验证请求有效性)
3.在BaseApi里 Nancy的 BeforeRequest 方法 前置拦截,在调用api时候 会先进入这个方法(那么就可以搞事情了,在这里验证登录请求有效性,及权限,访问api次数等等 一些,返回值 没有通过验证的话 直接 return null)
4.在BaseApi里 Nancy的 AfterResponse方法 后置拦截 可以在这里修改或替换当前的Response,我的应用暂时是数据压缩。
5.在BaseApi里 Nancy的 OnErroe方法 记录日志,调用api错误时候会进入此方法,记录错误信息
6.服务api继承自BaseApi ,然后实现自己业务逻辑就好了。