构建Web API服务
构建动态Web API控制器
ABP可以自动地为应用层生成Web API 层。比如说我们之前创建的应用层:
namespace Noah.ChargeStation.Application.CitiesApp
{
public interface ICityAppService:IApplicationService
{
GetCitiesOutput GetCities(GetCityInput input);
Task<GetCitiesOutput> GetCitiesAsync(GetCityInput input);
void UpdateCity(CityInput input);
Task UpdateCityAsync(CityInput input);
void CreateCity(CreateCityInput input);
Task CreateCityAsync(CreateCityInput input);
}
}
我们想要把这些服务作为Web API 控制器暴露给客户端。ABP通过一句代码就可以自动、动态地为该应用层创建Web API 控制器,在Web API层的Api文件夹下找到xxxWebApiModule类的Initialize方法,添加代码:
DynamicApiControllerBuilder.For<ICityAppService>("ChargeStationAPI/City").Build();
你要做的就这么多!这样,在“/api/services/chargeStationAPI/City”的地方就创建了一个API控制器,所有的方法客户端都可以使用。
ICityAppService是我们想要使用Api 控制器包装的应用服务。对于应用服务这不是强制的而是传统推荐的方式。“ChargeStationAPI/CIty”是一个有着任意命名空间的控制器名字。你应该至少定义一级的命名空间,也可以定义更深层次的命名空间,
比如“myCompany/myApplication/myNamespace1/myNamespace2/myServiceName”。“/api/services/”是所有的Web API控制器的前缀 。因而API控制器的地址将会是这个样子的“/api/services/ChargeStationAPI/City”,GetCities方
法的地址就是“/api/services/ChargeStationAPI/City/getCities”。因为在Javascript中的命名惯例是camelCase,所以方法名就自动转成了camelCase命名的格式。
ForAll 方法
在一个应用中,我们可能有许多应用服务,一个一个地构建api控制器也许是一个乏味而难忘的工作。DynamicAPIControllerBuilder提供了一种方法,可以在一次调用中,对所有的应用服务创建web api 控制器。例如:
DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(ChargeStationApplicationModule).Assembly, "ChargeStationAPI")
.Build();
ForAll方法是一个接收接口的泛型方法。第一个参数是程序集对象,该程序集包含从给定接口派生的类。最后一个参数是服务命名空间的后缀。比如我们在给定程序集中有ICityAppService和IProvinceAppService。对于该配置,服务就是
“/api/services/ChargeStationAPI/CityApp”和“/api/services/ChargeStationAPI/ProvinceApp”。计算服务名的过程是这样的:移除服务接口的Service和AppService后缀以及I前缀。而且,服务名格式被转成了camelCase格式。如果不喜欢
这个转换,那么你可以通过“WithServiceName”方法决定你命名。除此之外,还有一个Where方法来过滤服务。如果你要为所有的应用服务构建, 其次在此基础上再排除一些,那么这很有用。
重写ForAll方法
可以在ForAll方法之后重写配置。例如:
DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(ChargeStationApplicationModule).Assembly, "ChargeStationAPI")
.Build();//告诉生成器为所有实现了IApplicationService接口的服务方法创建api控制器
DynamicApiControllerBuilder
.For<ICityAppService>("ChargeStationAPI/City")
.ForMethod("CreateCity").DontCreateAction()
.Build();//告诉生成器不要生成"ChargeStationAPI/City"的"CreateCity"方法
Http 动词
所有的方法默认都是以POST方式创建的。因此,为了使用创建的Web Api方法,客户端应该发送post请求。我们通过不同的方式改变这个行为。
WithVerb方法
可以为一个方法使用WithVerb,像下面这样:
DynamicApiControllerBuilder.For<ICityAppService>("ChargeStationAPI/City")
.ForMethod("getCities").WithVerb(HttpVerb.Get)
.Build();
下面直接演示一下:

我们直接在Url地址栏发送一次get请求,发现有一个Json格式的数据,错误信息很明确,“输入是null”。虽然报错了,至少可以肯定的是已经生成了web api控制器,只是该控制器需要一个输入参数而已。
HTTP特性
我们可以把HttpGet,HttpPost…特性加到服务接口的方法上:
public interface ICityAppService:IApplicationService
{
[HttpGet]
GetCitiesOutput GetCities(GetCityInput input);
[HttpGet]
Task<GetCitiesOutput> GetCitiesAsync(GetCityInput input);
[HttpPost]
void UpdateCity(CityInput input);
[HttpPost]
Task UpdateCityAsync(CityInput input);
[HttpPost]
void CreateCity(CreateCityInput input);
[HttpPost]
Task CreateCityAsync(CreateCityInput input);
}
要使用这些HTTP特性,就必须向应用层项目中添加Microsoft.AspNet.WebApi.Core Nuget包的引用。添加了HTTP特性之后,就不需要使用上面的WithVerb方法了。
命名惯例
不需要为每一个方法声明HTTP动词,可以使用WithConventionalVerbs方法:
DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(ChargeStationApplicationModule).Assembly, "ChargeStationAPI")
.WithConventionalVerbs()//根据方法名使用惯例HTTP动词,默认对于所有的action使用Post
.Build();
这种情况,HTTP动词是通过方法名的前缀决定的:
- Get:方法名以Get开头。
- Put:方法名以Put或Update开头。
- Delete:方法名以Delete或Remove开头。
- Post:方法名以Post或Create开头。
- 否则,Post是HTTP动词的默认值。
我们可以通过对特定的方法使用WithVerb方法或者HTTP特性来覆盖上述惯例。
动态Javascript代理
在Javascript中,可以经由Ajax使用动态创建的web api控制器。ABP通过为动态的web api控制器创建动态的Javascript代理简化了这个。因此,可以在Javascript中像调用一个function一样来调用一个动态的web api 控制器action:
Javascript代理是动态创建的。使用之前应该将下面动态的脚本包括在页面上。
<script src="~/api/AbpServiceProxies/GetAll"></script>
可以注册done,fail,then等回调函数。服务方法内部使用了abp.ajax。如果需要的话,它们处理错误并显示错误信息。
Ajax参数
可以传递一个自定义的ajax参数给代理方法。可以将它们作为第二个参数传递:
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!');
});
单独服务脚本
'/api/AbpServiceProxies/GetAll'在一个文件中生成所有的服务代理。使用'/api/AbpServiceProxies/Get?name=serviceName'也可以生成一个单独的服务代理,只需要在页面中包括下面的代码:
<script src="/api/AbpServiceProxies/Get?name=tasksystem/task" type="text/javascript"></script>
Angular支持
ABP可以作为angular服务暴露动态的api控制器。
(function() {
angular.module('ChargeStationAPI').controller('CityListController', [
'$scope', 'abp.services.chargeStationAPI.City',
function($scope, cityService) {
var vm = this;
vm.cities = [];
taskService.getCities({
ProvinceCode: 1
}).success(function(result) {
vm.cities = result.cities;
});
}
]);
})();
我们可以使用服务的名字(包含命名空间)注射一个服务。然后,可以作为正常的Javascript函数调用它的function。注意,我们注册到了success句柄上(而不是done),因为它就像在angular的$http服务中。ABP使用AngularJs的$http服务。如果
你想要传递$http配置,可以作为服务方法的最后一个参数传递一个配置对象。
要使用自动生成的服务,应该在页面中包含需要的脚本:
<script src="~/Abp/Framework/scripts/libs/angularjs/abp.ng.js"></script>
<script src="~/api/AbpServiceProxies/GetAll?type=angular"></script>
构建Web API服务的更多相关文章
- 延迟调用或多次调用第三方的Web API服务
当我们调用第三方的Web API服务的时候,不一定每次都是成功的.这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务. Task的静态方法Delay允许我们延迟执行某个Task,此方 ...
- 使用HttpClient对ASP.NET Web API服务实现增删改查
本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查. 创建ASP.NET Web API项目 新建项目,选择"ASP.NET MVC 4 Web应用程序&quo ...
- 使用HttpClient消费ASP.NET Web API服务
本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...
- RESTFul Web Api 服务框架(一)
简介: 基于 REST 的 Web 服务日益成为后端企业服务集成的首选,因为它比 SOAP 更加简单.这篇文章介绍了一 个简单的可扩展框架,使用Asp.net Web Api作为 REST 服务的实现 ...
- .net core自定义高性能的Web API服务网关
网关对于服务起到一个统一控制处理的作用,也便于客户端更好的调用:通过网关可以灵活地控制服务应用接口负载,故障迁移,安全控制,监控跟踪和日志处理等.由于网关在性能和可靠性上都要求非常严格,所以针对业务需 ...
- angular 4 http 之web api 服务
Angular Http是获取和保存数据的.主要是为了取到我json文件里的数据. 直接上代码吧: 1. 先介绍Promise模式的:(直接代码) heroes.json: 1 2 3 4 5 6 ...
- ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...
- Mysql EF Core 快速构建 Web Api
(1)首先创建一个.net core web api web项目; (2)因为我们使用的是ef连接mysql数据库,通过NuGet安装MySql.Data.EntityFrameworkCore,以来 ...
- VS调试web api服务
vs2013开发web api service时,使用vs开发服务器调试没有问题,但将项目放到另一台电脑调试(vs2010),总会提示 无法再以下端口启动asp.net开发服务器 错误:通常每个套接字 ...
随机推荐
- AndroidTips-052:.aar文件依赖
aar aar 文件是android 类库项目的输出文件,其中可以包含普通的.class,清单,以及android项目特有的资源文件. 使用方式 将.aar文件放在在自己项目的libs目录下 在gra ...
- 如何快速优化手游性能问题?从UGUI优化说起
WeTest 导读 本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法. 在之前的文 ...
- 操作系统篇-hello world(免系统运行程序)
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...
- 【NLP】前戏:一起走进条件随机场(一)
前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...
- 用WebRequest +HtmlAgilityPack 从外网抓取数据到本地
相信大家对于WebRequest 并不陌生,我们在C#中发请求的方式,就是创建一个WebRequest .那么如果我们想发一个请求到外网,比如国内上不了的一些网站,那么该怎么做呢? 其实WebRequ ...
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. ...
- [转载]SQL Server 2008 R2安装时选择的是windows身份验证,未选择混合身份验证的解决办法
安装过程中,SQL Server 数据库引擎设置为 Windows 身份验证模式或 SQL Server 和 Windows 身份验证模式.本文介绍如何在安装后更改安全模式. 如果在安装过程中选择&q ...
- 图解Spark API
初识spark,需要对其API有熟悉的了解才能方便开发上层应用.本文用图形的方式直观表达相关API的工作特点,并提供了解新的API接口使用的方法.例子代码全部使用python实现. 1. 数据源准备 ...
- Vue.js——vue-resource全攻略
概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用,并实现了一个简单的跨域CURD示例.Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的D ...
- Java中的Checked Exception——美丽世界中潜藏的恶魔?
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...