ABP动态webapi前端怎么调用?
研究abp项目时,页面js文件中一直不明白abp.services... 是从哪里来的
在调试SimpleTaskSystem的AngularJs demo时,一开始我只看到对服务的应用。
代码语言:javascript复制app.controller(controllerId, [
'$scope', 'abp.services.tasksystem.task',
function($scope, taskService){}]);
在查找源代码中的所有js文件后还是没找到abp.services.tasksystem.task的定义,那么现在就剩下最后一种情况。这些服务是系统生成的,这样的话与动态WebApi的设计思路也是一致的。在layout.cshtml中有两处js引用
代码语言:javascript复制<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为例。
代码语言:javascript复制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主要提供一些基础的配置信息到客户端。
代码语言:javascript复制[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信息 |