用javascript映射WebAPI,在VisualStudio直接“點”出來

通過用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編輯器中引入這個文件,就能點出來了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章