<<ABP框架>> 動態Web Api層

来源:http://www.cnblogs.com/kid1412/archive/2016/10/30/6012304.html
-Advertisement-
Play Games

文檔目錄 本節內容: 創建動態Web Api控制器 ForAll 方法 重寫 ForAll ForMethods Http 動詞 WithVerb 方法 HTTP 特性 命名約定 Api 瀏覽器 RemoteService 特性 動態Javascript代理 AJAX 參數 單獨服務腳本 Angul ...


文檔目錄

 

本節內容:

 

創建動態Web Api 控制器

這個文檔是關於Asp.net Web Api的,如果你對Asp.net Core感興趣,可查看Asp.net Core文檔。

ABP可為你的應用層自動創建Asp.net Web Api層,假設我們有一個如下所示的應用服務: 

public interface ITaskAppService : IApplicationService
{
    GetTasksOutput GetTasks(GetTasksInput input);
    void UpdateTask(UpdateTaskInput input);
    void CreateTask(CreateTaskInput input);
}

我們想把這個服務作為一個Web Api控制器暴露給客戶端,ABP可通過一行配置為這個應用服務,自動動態創建一個Web Api控制器:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder.For<ITaskAppService>("tasksystem/task").Build(); 

這就完事了。一個api控制器被創建在地址“/api/services/tasksystem/task”下,所有的方法客戶端都可以使用。這個配置應當在你的模塊Initialize方法里完成。

ITaskAppService是想要用一個api控制器來包裝的應用服務介面,它對於應用服務不是必需,但這是一種約定和建議的做法。“tasksystem/task”是這個api控制器的名稱和一個任意的命名空間,你應當定義至少一級的命名空間,但你可以定義更深的命名空間,如“myCompany/myApplication/myNamespace1/myNamespace2/myServiceName”。“/api/services”是所有動態Web Api控制器的首碼,所以這個Api控制器的地址形如“/api/services/tasksystem/task”,GetTasks方法的地址將是“/api/services/tasksystem/task/getTasks”,方法名被轉換成駝峰形式,因為在Javascript世界里就是這樣約定俗成。

 

ForAll 方法

在一個應用里可能有很多應用服務,一個一個地創建api控制器會是一件乏味並易遺漏的工作,DynamicApiControllerBuilder提供了一個為所有應用服務創建web api控制器一次調用的方法,例如:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .ForAll<IApplicationService>(Assembly.GetAssembly(typeof(SimpleTaskSystemApplicationModule)), "tasksystem")
    .Build();

ForAll方法是一個接受一個介面的泛型,第一個參數是程式集,它包含繼承自前面所指定介面的類,第二個服務的命名空間首碼,假設我們有一個包含ITaskAppService和IPersonAppService的程式集,應用上述配置,服務將是:“/api/services/tasksystem/task”和“/api/services/tasksystem/person”。為計算服務名:Service和AppService尾碼和I首碼(介面)會被移除,服務名也被轉換成駝峰形式。如果你不喜歡這種約定,有一個“WithServicename”方法可以確定命名。還有一個Where方法可過濾服務,這在你想為除了少數幾個外的所有應用服務創建api控制器的時候,非常有用。

 

重寫 ForAll

我們可在ForAll方法之後,重寫配置,例如:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .ForAll<IApplicationService>(Assembly.GetAssembly(typeof(SimpleTaskSystemApplicationModule)), "tasksystem")
    .Build();

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .For<ITaskAppService>("tasksystem/task")
    .ForMethod("CreateTask").DontCreateAction().Build();

這段代碼里,我們為一個程式集里的所有應用服務創建Web Api控制器,然後為一個單獨的應用服務(ITaskAppService)重寫配置,忽略CreateTask方法。

 

ForMethod

當使用ForAll方法時,我們可用ForMethods方法進行更好的調用 ,例如:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .ForAll<IApplicationService>(Assembly.GetExecutingAssembly(), "app")
    .ForMethods(builder =>
    {
        if (builder.Method.IsDefined(typeof(MyIgnoreApiAttribute)))
        {
            builder.DontCreate = true;
        }
    })
    .Build();

在這個示例里,用一個自定義特性(MyIgnoreApiAttribute)來檢查所有方法,不為標記了這個特性的方法創建動態web api控制器。

 

Http 動詞

預設地,所有方法被創建成POST,所以一個客戶端應用發送post請求來使用已創建的web api的actions。我們可以把這種行為修改成不同的方式。

 

WithVerbMethod

我們可以為一個方法使用WithVerb,如:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .For<ITaskAppService>("tasksystem/task")
    .ForMethod("GetTasks").WithVerb(HttpVerb.Get)
    .Build();

 

HTTP 特性

在服務介面里,我們可以給方法添加HttpGet、HttpPost等特性: 

public interface ITaskAppService : IApplicationService
{
    [HttpGet]
    GetTasksOutput GetTasks(GetTasksInput input);

    [HttpPut]
    void UpdateTask(UpdateTaskInput input);

    [HttpPost]
    void CreateTask(CreateTaskInput input);
}

為使用這些特性,應該在項目里添加Microsoft.Asp.net.WebApi.Core的nuget包,並引用它。

 

命名約定

你可以使用WithconvertionalVerbs方法,代替為每個方法聲明HTTP動詞,如下所示:

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .ForAll<IApplicationService>(Assembly.GetAssembly(typeof(SimpleTaskSystemApplicationModule)), "tasksystem")
    .WithConventionalVerbs()
    .Build();

這種情況下,以方法名的首碼確定HTTP動詞:

  • Get:如果方法名以“Get”打頭。
  • Put:如果方法名以“Put”或“Update”打頭。
  • Delete: 如果方法名以“Delete”或“Remove”打頭。
  • Post:如果方法名以“Post”或“Create”或“Insert”打頭。
  • Patch:如果方法名以“Patch”打頭。
  • 否則:以Post作為預設的HTTP動詞。

但我們也可以用前面據說的方法重寫它。

 

Api 瀏覽器

預設情況下,所有的動態Web api 控制器都會顯示在Api瀏覽器里(例如:Swagger),不過你可以通過flunet DynamicApicontrollerBuilder Api或RemoteService特性來改變這種行為。

 

RemoteService 特性

你可為任何的介面或方法使用RemoeteService來定義啟用/禁用(IsEnabled)動態Api或Api瀏覽器設置(IsMetadataEnabled)。

 

動態Javascript代理

你可以通過Javascript的ajax使用動態創建的web api控制器,ABP也通過為api控制器創建動態Javascript代理來簡化調用。所以,你可以用像javascript調用函數那樣的方式來調用一個動態web api控制器的Action:

abp.services.tasksystem.task.getTasks({
    state: 1
}).done(function (result) {
    //use result.tasks here...
});

Javascript的代理是動態創建的,在使用之前,你應當在你的頁面里添加動態腳本:

<script src="/api/AbpServiceProxies/GetAll" type="text/javascript"></script>

服務方法返回promise(查看jQuery.Deferred),你可以註冊done, fail, then等回調函數,服務方法內部使用abp.ajax,它們在需要的時候處理錯誤並顯示。

 

AJJX 參數

你可能想傳遞自定義參數給代理方法,你可以把它們作為第二個參數,如下所示:

abp.services.tasksystem.task.createTask({
    assignedPersonId: 3,
    description: 'a new task description...'
},{ //override jQuery's ajax parameters
    async: false,
    timeout: 30000
}).done(function () {
    abp.notify.success('successfully created a task!');
});

jQuery.ajax的所有參數在此都是可用的。

除了標準的jQuery.ajax參數外,你可以給AJAX選項添加abpHandleError:false,以便禁用出錯時自動顯示出錯信息。

 

單獨服務腳本

“/api/AbpServiceProxies/GetAll”在一個文件里生成所有服務代理。你也可以生成單獨的服務代理,使用“/api/AbpServiceProxies/Get?name=serviceName”,然後在頁面里包含這個腳本 ,如下所示:

<script src="/api/AbpServiceProxies/Get?name=tasksystem/task" type="text/javascript"></script>

 

Angular 集成

ABP可以把動態api控制器暴露成一個angularjs服務,假設有個如下所示的例子:

(function() {
    angular.module('app').controller('TaskListController', [
        '$scope', 'abp.services.tasksystem.task',
        function($scope, taskService) {
            var vm = this;
            vm.tasks = [];
            taskService.getTasks({
                state: 0
            }).success(function(result) {
                vm.tasks = result.tasks;
            });
        }
    ]);
})();

我們可以使用它的名稱(包含命名空間)註入一個service,然後就可以如調用常規的Javascript函數那樣調用它的函數,註意:我們註冊success處理程式(代替done),因為這就像在angular的$http服務里,ABP使用Angularjs的$http服務,如果你想傳遞$http的configuration,你可以傳遞一個configuration對象,作為服務方法的最後一個參數。

為了使用自動生成的服務,你應該在你的頁面里包含必要的腳本:

<script src="~/Abp/Framework/scripts/libs/angularjs/abp.ng.js"></script>
<script src="~/api/AbpServiceProxies/GetAll?type=angular"></script>

  

啟用/禁用

如果你上面陳述的那樣,使用ForAll方法,你可以為一個服務或方法,使用RemoteService特性來禁用它,要在服務介面上使用這個特性,而不是服務類上。

 

包裝結果

ABP通過AjaxResponse對象包裝動態Web Api的Action返回值,更多信息查看ajax文檔。你可以為每個方法或每個應用服務啟用/禁用包裝,請看如下應用服務示例:

public interface ITestAppService : IApplicationService
{
    [DontWrapResult]
    DoItOutput DoIt(DoItInput input);
}

我們為DoIt方法禁用了包裝,這個屬性要聲明在介面里,而不是實現的類里。

如果你想更好地控制返回給客戶端的值,不包裝是非常有用的,尤其,在使用不支持ABP標準的AjaxResponse的第三方客戶端庫時,這種情況下,你也需要自己處理異常,因為異常處理也會被禁用(DontWrapResult特性擁有WrapOnError屬性,它能啟用異常的處理和包裝)。

註意:動態javascript代理可以理解沒有包裝的結果,並用適應的方式處理結果。

 

關於參數綁定

ABP在運行時創建Api控制器,所以,Asp.net Web Api的模型與參數綁定用來綁定模型和參數,更多信息你可以閱讀它們的文檔

 

FormUri 和 FormBody 特性

FormUri和FormBody特性可用在服務介面里,優先控制綁定。

 

DTO vs 簡單類型

我們強烈建議為應用服務和web api控制器的方法使用Dto,但你可以使用簡單類型(如string,int,bool...或nullable類型,如int?,bool?...)作為服務參數,可用多個簡單類型參數,但只能用一個複雜類型參數(由於Asp.net Web Api的限制)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文檔目錄 本節內容: 簡介 AbpController基類 本地化 其它 過濾 異常處理和結果包裝 審計日誌 驗證 授權 工作單元 反偽造 模型綁定器 本地化 其它 異常處理和結果包裝 審計日誌 驗證 授權 工作單元 反偽造 簡介 ABP通過nuget包Abp.Web.Mvc集成到Asp.net M ...
  • 經過一個多月晚上的時間,終於把開源物聯網通訊框架ServerSuperIO成功移植到Windows10 IOT上,暫時全名:ServerSuperIO.WinIOT(以後可能還會移植到Ubuntu上)。以後可以把ServerSuperIO框架應用到嵌入式設備上,移植的成功具有標誌性意義,意味著軟體和... ...
  • 文檔目錄 本節內容: 簡介 Asp.net Core 安裝 安裝Nuget包 配置 測試 Asp.net 5.x 安裝 安裝Nuget包 配置 測試 安裝 安裝Nuget包 配置 測試 安裝 安裝Nuget包 配置 測試 簡介 來自它的網頁:“...使用一個Swagger-enabled Api,你 ...
  • 前言: 由於先前用python+opencv做了一會兒人臉識別。(其實是別人做的,我是打醬油的)。 用winform做了當時用的一個功能界面。打開攝像頭併進行拍照保存。 界面預覽: 此次,利用的是winform+AForge框架。AForge是全過程都在用的,必須要有。 介紹一下製作過程: 1.創建 ...
  • 一、簡介 首先來看看.net的發展中的各個階段的特性:NET 與C# 的每個版本發佈都是有一個“主題”。即:C#1.0托管代碼→C#2.0泛型→C#3.0LINQ→C#4.0動態語言→C#4.5非同步編程 所謂的非同步編程是利用CPU空閑時間和多核的特性,它所返回的Task或Task是對await的一個 ...
  • 文檔目錄 本節內容: 簡介 安裝 安裝Nuget包 設置模塊依賴 配置你的實體 創建控制器 示例 獲取實體列表 請求 響應 獲取單個實體 請求 響應 獲取單個實體及導航屬性 請求 響應 查詢 請求 響應 創建一個新實體 請求 響應 獲取元數據 請求 響應 示例項目 安裝Nuget包 設置模塊依賴 配 ...
  • Quartz.NET是一個非常強大的作業調度框架,適用於各種定時執行的業務處理等,類似於WINDOWS自帶的任務計劃程式,其中運用Cron表達式來實現各種定時觸發條件是我認為最為驚喜的地方。 Quartz.NET主要用到下麵幾個類: IScheduler --調度器 IJobDetail --作業任 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ref_out { class Program { static void Method1(ref int ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...