动态We API层(动态生成js)
ABP动态webapi前端怎么调用?
研究abp项目时,页面js文件中一直不明白abp.services... 是从哪里来的
在调试SimpleTaskSystem的AngularJs demo时,一开始我只看到对服务的应用。
app.controller(controllerId, [
'$scope', 'abp.services.tasksystem.task',
function($scope, taskService){}]);
在查找源代码中的所有js文件后还是没找到abp.services.tasksystem.task的定义,那么现在就剩下最后一种情况。这些服务是系统生成的,这样的话与动态WebApi的设计思路也是一致的。在layout.cshtml中有两处js引用
<script src="~/api/AbpServiceProxies/GetAll?type=angular"></script>
<script src="~/AbpScripts/GetScripts" type="text/javascript"></script>
生成所有服务
~/api/AbpServiceProxies/GetAll?type=angular 对应的就是就是Abp对系统所有服务生成的JavaScript,现在对url进行反推我们可以在Abp.Web.Api中找到AbpServiceProxiesController,其中有一ScriptProxyManager 类型的字段_scriptProxyManager。ScriptProxyManager就是生成所有服务的一管理者。
在AbpServiceProxiesController中的GetAll方法有一参数type。这个参数表示根据什么js框架生成javascript,目前Abp提供了Angular与jQuery两种支持。
在ScriptProxyManager中会根据不同的type调用不同的IScriptProxyGenerator生成javascript代码。以Angular的实现AngularProxyGenerator为例。
public string Generate()
{
var script = new StringBuilder();
script.AppendLine("(function (abp, angular) {");
script.AppendLine("");
script.AppendLine(" if (!angular) {");
script.AppendLine(" return;");
script.AppendLine(" }");
script.AppendLine(" ");
script.AppendLine(" var abpModule = angular.module('abp');");
script.AppendLine(" ");
script.AppendLine(" abpModule.factory('abp.services." + _controllerInfo.ServiceName.Replace("/", ".") + "', [");
script.AppendLine(" '$http', function ($http) {");
script.AppendLine(" return new function () {");
foreach (var methodInfo in _controllerInfo.Actions.Values)
{
var actionWriter = CreateActionScriptWriter(_controllerInfo, methodInfo);
script.AppendLine(" this." + methodInfo.ActionName.ToCamelCase() + " = function (" + GenerateJsMethodParameterList(methodInfo.Method) + ") {");
script.AppendLine(" return $http(angular.extend({");
script.AppendLine(" abp: true,");
script.AppendLine(" url: abp.appPath + '" + actionWriter.GetUrl() + "',");
actionWriter.WriteTo(script);
script.AppendLine(" }, httpParams));");
script.AppendLine(" };");
script.AppendLine(" ");
}
script.AppendLine(" };");
script.AppendLine(" }");
script.AppendLine(" ]);");
script.AppendLine();
//generate all methods
script.AppendLine();
script.AppendLine("})((abp || (abp = {})), (angular || undefined));");
return script.ToString();
}
AngularProxyGenerator对所有的服务与Action进行了扫描生成javascript。
不过将所有服务都返回到客户端,好像并不怎么安全。
另外ScriptProxyManager对生成的javascript代码进行了缓存。
基础配置
~/AbpScripts/GetScripts对应的则是Abp.Web.Mvc下的AbpScriptsController,AbpScriptsController主要提供一些基础的配置信息到客户端。
[DisableAuditing]
public async Task<ActionResult> GetScripts()
{
var sb = new StringBuilder();
sb.AppendLine(_multiTenancyScriptManager.GetScript());
sb.AppendLine();
sb.AppendLine(_sessionScriptManager.GetScript());
sb.AppendLine();
sb.AppendLine(_localizationScriptManager.GetScript());
sb.AppendLine();
sb.AppendLine(await _authorizationScriptManager.GetScriptAsync());
sb.AppendLine();
sb.AppendLine(await _navigationScriptManager.GetScriptAsync());
sb.AppendLine();
sb.AppendLine(await _settingScriptManager.GetScriptAsync());
sb.AppendLine(GetTriggerScript());
return Content(sb.ToString(), "application/x-javascript", Encoding.UTF8);
}
这些信息分别是:
接口 |
实现 |
说明 |
---|---|---|
IMultiTenancyScriptManager |
MultiTenancyScriptManager |
多租户配置 |
ISettingScriptManager |
SettingScriptManager |
Abp基础配置 |
INavigationScriptManager |
NavigationScriptManager |
导航信息 |
ILocalizationScriptManager |
LocalizationScriptManager |
本地化 |
IAuthorizationScriptManager |
AuthorizationScriptManager |
权限 |
ISessionScriptManager |
SessionScriptManager |
Session信息 |
- 泛型介绍(接上一篇,具体的事例随后呈上)
- PHP高级编程之守护进程
- 看到他我一下子就悟了-- 泛型(2)
- ExtJS4中设置tabpanel的tab高度问题
- Oracle写错误与文件离线
- 看到他我一下子就悟了-- 泛型(1)
- EXTJS4 Grid Filter 插件的使用 与后台数据解析------Extjs 查询筛选功能的实现
- [Java]读取文件方法大全
- WPF Application 类介绍以及怎样修改启动方式
- C#基础知识回顾-- 反射(4)
- C#基础知识回顾-- 反射(3)
- 微信图文消息添加音乐一招搞定 只需修改背景音乐地址
- C#基础知识回顾-- 反射(2)
- MongoDB 主从配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java生成随机姓名、性别和年龄
- 商业数据分析从入门到入职(8)Python模块、文件IO和面向对象
- 7.13论坛常见问题以及解决办法
- 移植SDL到JZ2440显示BMP图片
- Vue图片验证码-自定义组件高级版
- Angular页面调试一个有用的小技巧 - normalizeDebugBindingName和normalizeDebugBindingValue
- 19个JS超有用的简写技巧
- 【教程】移植web server到Ubuntu就是这么简单!
- 为什么采用Proxy重构响应系统 | Vue3源码系列
- 制作Linux嵌入式系统开机LOGO(图片)
- R语言奇淫巧技之pdftools包
- 14个Spring MVC超实用技巧!
- 想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化
- 初识Pandas
- 【教程】从零制作文件系统到jz2440,使其支持telnet , ftp 和tftp