您的位置:首页 > Web前端 > JavaScript

用javascript映射WebAPI,在VisualStudio直接“点”出来

2014-07-07 18:03 387 查看
通过用js文件映射服务端的WebAPI,最终实现的效果就是在VS编辑器中直接可以“点”出方法名、参数。

var API = new Object();

/**

* @method _Ajax 异步请求方法

* @param {String} [_type] 请求类型(GET/POST/PUT/DELETE)

* @param {String} [_url] 请求的资源地址

* @param {Object} [_data] 请求时传入的数据为JSON对象

* @param {Function} [_okCall] 请求成功后的回调

* @param {Function} [_errorCall] 请求失败后的回调

*/

API._Ajax = function (_type, _url, _data, _okCall, _errorCall) {

    $.ajax({

        type: _type,

        url: _url,

        data: _data,

        dataType: "json",

        error: function (e) { if (_errorCall != undefined) _errorCall(e); else console.log(JSON.stringify(e)); },

        success: function (data) { if (_okCall != undefined) _okCall(data); else console.log(JSON.stringify(data)); },

        beforeSend: function (request) {

            request.setRequestHeader("Custom-Auth-Name", window.localStorage.getItem("User-Account"));

            request.setRequestHeader("Custom-Auth-Key", API._AuthenKey(_url));

        },

    });

}

/**

* @method _AuthenKey 生成请求密钥

* @param {String} [_resourceUri] 请求的资源地址

*/

API._AuthenKey = function (_resourceUri) {

    /*生成guid*/

    var Guid = function () {

        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {

            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);

            return v.toString(16);

        });

    };

    /*MD5加密*/

    var Md5 = function (_content, _md5Count) {

        if (_md5Count == undefined) { _md5Count = 1; }

        for (i = 0; i < _md5Count; i++) {

            _content = CryptoJS.MD5(_content).toString().toUpperCase();

        }

        return _content;

    };

    /*用户的会话令牌*/

    var Token = function () {

        /*需要从数据库读取*/

        var _userToken = window.localStorage.getItem("User-Token");

        /*把token进行2次MD5加密,然后根据服务器格式截取前8位*/

        var token = Md5(_userToken, 2).substr(0, 8);

        /*转换成加密需要的格式*/

        return CryptoJS.enc.Utf8.parse(token);

    }

    /*请求的资源地址*/

    var ResourceUrl = function () {

        /*生成GUID*/

        var guid = Guid();

        if (APP.Debug) {

            console.log("guid:" + guid);

        }

        /*获取资源前缀*/

        var BasePsotion = _resourceUri.indexOf("/api/");

        /*将请求的资源地址去掉前缀*/

        var ResourceUrl = _resourceUri.substr(BasePsotion);

        if (APP.Debug) {

            console.log("ResourceUrl:" + ResourceUrl);

        }

        /*把资源和guid做md5,然后在加空格和guid*/

        var strToEncrypt = Md5(ResourceUrl + guid) + " " + guid;

        if (APP.Debug) {

            console.log("strToEncrypt:" + strToEncrypt);

        }

        /*转换成加密需要的格式*/

        return CryptoJS.enc.Utf8.parse(strToEncrypt);

    }

    /*服务器加密IV*/

    var IV = function () { return CryptoJS.enc.Utf8.parse("12345678"); }

    /*生成验证密钥*/

    var AuthKey = CryptoJS.DES.encrypt(ResourceUrl(), Token(), { iv: IV() });

    if (APP.Debug) {

        console.log("AuthKey:" + AuthKey);

    }

    /*返回*/

    return AuthKey;

}

/**

* @class API._Method Http请求方法枚举

*/

API._Method = {

    /**

    * @property Post POST

    */

    Post: "POST",

    /**

    * @property Get GET

    */

    Get: "GET",

    /**

    * @property Put PUT

    */

    Put: "PUT",

    /**

    * @property Delete DELETE

    */

    Delete: "DELETE"

};

/**

* @method _Initialise 初始化内部的API方法

*/

API._Initialise = function () {

    var APIAgrements = function (_APIUrl) {

        var reg = new RegExp(/\{[a-zA-Z0-9_]{1,}\}/g);

        var args = _APIUrl.match(reg)

        var result = new Array();

        if (args != null && args.length > 0) {

            for (var i = 0; i < args.length; i++) {

                result.push(args[i].substr(1, args[i].length - 2));

            }

        }

        return result;

    }

    for (var i = 0; i < API._Controller.length; i++) {

        var ctrl = API._Controller[i];

        /*当前API需要的参数集合*/

        var args = APIAgrements(ctrl.Url);

        /*拼接API调用时需要传入的参数*/

        var apiArgs = args.length > 0 ? (args.join(",") + ",") : "";

        var apiUrl = "'";

        if (args.length > 0) {

            var urlFormat = new Array();

            for (var q = 0; q < args.length; q++) {

                urlFormat.push('"' + args[q] + '":' + args[q] + '');

            }

            apiUrl += ".format({" + urlFormat.join(",") + "})";

        }

        var api = "API." + ctrl.Name + " = function (" + apiArgs + "_data,_okCall,_errorCall) {" +

                "var type='" + (ctrl.Method == undefined ? API._Method.Get : ctrl.Method) + "';" +

                "var url ='" + ctrl.Url + apiUrl + ";" +

                "API._Ajax(type,url,_data,_okCall,_errorCall);" +

            "}";

        eval("(" + api + ")");

    }

}

/**

* @class API._Controller API映射

* 所有配置在这里写

* 【API配置示例】

* 说明:映射License控制器的_CheckLicenseCode方法

* 代码:{ Name: "License", Url: "http://localhost:45617/api/Licenses",Method:API._Method.Post },

* 【API调用示例】

* API.License({ LicenseCode: "FZYF-YDBG" });

* 【其他说明】

* 1,配置API时,Method字段不是必需定义的,默认请求方式是GET

* 2,调用API时,如果不传成功/失败回调方法,框架自动在控制台打印响应内容(测试用)

*/

API._Controller = [

    /**

    * @property License 授权信息

    * @param {String} [DeviceMac] 设备物理地址

    * @param {String} [DeviceOS] 设备操作系统信息

    * @param {String} [PhoneNumber] 设备注册使用的手机号

    * @param {String} [LicenseCode] 录入的验证码

    */

    { Name: "License", Url: "http://192.168.0.111:8866/api/Licenses", Method: API._Method.Post },

    /**

    * @property NewsCatalog 新闻分类

    */

    { Name: "NewsCatalog", Url: "http://192.168.0.111:8866/api/NewsCatalogs" },

    /**

    * @property News 新闻列表

    * @param {String} [id] 新闻分类的id

    */

    { Name: "News", Url: "http://192.168.0.111:8866/api/TextNews/{id}/News" },

    /**

    * @property News_Detal 新闻详情

    * @param {String} [subid] 新闻id

    */

    { Name: "News_Detal", Url: "http://192.168.0.111:8866/api/TextNews/{NewsID}/Content" },

    /**

    * @property Logo 图片

    */

    { Name: "Logo", Url: "http://192.168.0.111:8866/api/Corps/{id}/Logo" },

    /**

    * @property UserAccount账号信息

    * @param {String} [UserName] 设备物理地址

    * @param {String} [Account] 设备操作系统信息

    * @param {String} [Password] 设备注册使用的手机号

    * @param {String} [Token] 录入的验证码

    * @param {String} [OwnerDept] 录入的验证码

    * @param {String} [OwnerDeptID] 当前部门ID

    */

    { Name: "UserAccount", Url: "http://192.168.0.111:8866/api/UserAccounts" },

];

API._Initialise();

备注:以上代码是项目中的,实际还需要修改一下。 这样的话直接在VS编辑器中引入这个文件,就能点出来了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息