前言
最近同事在使用 ABP 時,查看 ABP 自動產生的 Web API Route 覺得怪怪的!
他的 ApplicationService 名稱為 OrganizationalUnitAppService
,
其中有一個 Method 為 IEnumerable<OrganizationalUnitDto> GetAllOrganizationalUnits(string companyId)
,
結果出來的 Web API Route Path 為,/api/app/organizational-unit/organizational-units/{companyId}
,
名稱中間怎麼用 - 串起來,而且 GetAll 怎麼不見了?
研究
依ABP Framework 3.3 to 4.0 Migration Guide,
ABP 4 以後的 auto API controller routes 改使用 kebab-case
,
如果要用 ABP 4 之前的方式 CamelCase
,則要設定 AbpConventionalControllerOptions
,如下,
1 | Configure<AbpConventionalControllerOptions>(options => |
那 API controller routes 就會變成,/api/app/organizationalUnit/organizationalUnits/{companyId}
預設的 RootPath 是 app
,如果有多個組件要改名稱的話,則可以設定 ConventionalControllerSetting
的 RootPath
,如下,
1 | Configure<AbpAspNetCoreMvcOptions>(options => |
那 API controller routes 就會變成,/api/NornsOGService/organizationalUnit/organizationalUnits/{companyId}
那 GetAll
怎麼會不見呢?
在 Auto API Controllers 中有說明,
Removing HTTP method prefix. ‘GetList’, ‘GetAll’, ‘Get’, ‘Put’, ‘Update’, ‘Delete’, ‘Remove’, ‘Create’, ‘Add’, ‘Insert’, ‘Post’ and ‘Patch’ prefixes are removed based on the selected HTTP method. So, ‘GetPhones’ becomes ‘Phones’ since ‘Get’ prefix is a duplicate for a GET request.
所以 GetAll
被自動移除掉了,
查看 Abp ConventionalRouteBuilder.cs 裡面的 NormalizeUrlActionName
,
1 | protected virtual string NormalizeUrlActionName(string rootPath, string controllerName, ActionModel action, |
那如果想要讓它長回來呢(不建議)? 則可以設定 UrlActionNameNormalizer
的內容,如下,
1 | Configure<AbpAspNetCoreMvcOptions>(options => |
那 API controller routes 就會變成,api/NornsOGService/organizationalUnit/getAllOrganizationalUnits/{companyId}
參考資源
Auto API Controllers
Abp HttpMethodHelper.cs
Abp BlogsController.cs
Create auto controller routes in kebap-case
ABP Framework 3.3 to 4.0 Migration Guide
abp 集成 asp.net core
Abp ConventionalRouteBuilder.cs