项目

动态 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选项的对象。

示例:设置typedataType选项

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端点详情自动生成。

扩展阅读

在本文档中