动态 JavaScript API 客户端代理
通常我们会从 JavaScript 代码中调用 HTTP API。传统做法需要处理底层的 AJAX 调用,例如使用 $.ajax 或更优的 abp.ajax 。ABP 框架提供了一种更优方案:通过 JavaScript API 客户端代理调用 HTTP API!
静态与动态 JavaScript 客户端代理对比
ABP提供两种类型的客户端代理生成系统。本文重点介绍动态客户端代理,它会在运行时生成客户端代理。您也可以查阅 静态JavaScript API客户端代理 文档了解开发时生成代理的方式。
开发时(静态)客户端代理生成具有轻微性能优势,因为无需在运行时获取HTTP API定义。但每当修改API端点定义时,都需要重新生成客户端代理代码。而动态客户端代理在运行时生成,能提供更便捷的开发体验。
快速示例
假设您定义了如下应用服务:
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Acme.BookStore.Authors
{
public interface IAuthorAppService : IApplicationService
{
Task<AuthorDto> GetAsync(Guid id);
Task<PagedResultDto<AuthorDto>> GetListAsync(GetAuthorListDto input);
Task<AuthorDto> CreateAsync(CreateAuthorDto input);
Task UpdateAsync(Guid id, UpdateAuthorDto input);
Task DeleteAsync(Guid id);
}
}
您可以通过Web应用开发教程系统学习如何创建应用服务、将其发布为HTTP API,并通过JavaScript代码进行调用。
您可以像调用JavaScript函数一样调用这些方法。JavaScript函数与C#方法具有完全相同的函数名、参数和返回值。
示例:获取作者列表
acme.bookStore.authors.author.getList({
maxResultCount: 10
}).then(function(result){
console.log(result.items);
});
示例:删除作者
acme.bookStore.authors.author
.delete('7245a066-5457-4941-8aa7-3004778775f0') //从某处获取ID!
.then(function() {
abp.notify.info('删除成功!');
});
AJAX细节说明
JavaScript客户端代理函数底层使用abp.ajax,因此您将获得自动错误处理等同等优势。同时,您可以通过配置选项完全控制AJAX调用。
返回值
每个函数都会返回一个延迟对象。这意味着您可以通过then获取结果,通过catch处理错误,通过always在操作完成时(无论成功或失败)执行特定操作。
AJAX选项
每个函数在自身参数之后会接收一个额外参数。该参数称为ajaxParams,是一个用于重写AJAX选项的对象。
示例:设置type和dataType选项
acme.bookStore.authors.author
.delete('7245a066-5457-4941-8aa7-3004778775f0', {
type: 'POST',
dataType: 'xml'
})
.then(function() {
abp.notify.info('删除成功!');
});
所有可用选项请参阅jQuery.ajax文档。
服务代理脚本端点
该功能通过ABP定义的/Abp/ServiceProxyScript端点实现,该端点会自动添加到布局中。您可以在应用程序中访问该端点查看客户端代理函数定义。该脚本文件由ABP根据服务端方法定义及相关HTTP端点详情自动生成。
抠丁客


