Web API目标是使一种通信技术非常灵活并满足所有需求。WCF最初基于SOAP(简单对象访问协议)。如今,我们有许多场景,不需要强大的SOAP增强功能。 对于更简单的场景,例如返回JSON的HTTP请求,WCF太复杂了。
Web API提供基于Representational State Transfer(REST)的简单通信技术。REST是一种基于某些约束的架构风格。 比较基于REST架构风格的服务与使用SOAP的服务的不同。
相同:
不同:
在较大的应用程序中,建议分离为多个库。
如果您创建包含services和models的库,则可以轻松地使用来自不同技术的相同类型(例如,Web API项目以及Azure Functions)。
Web Api 的实现(控制器——controller)也可以从宿主应用程序单独分离出来。
代码: BookChapter.cs
定义服务接口
代码: IBookChaptersService.cs(sync部分)
定义服务,用于检索,添加和更新书籍章节。
代码: BookChaptersService.cs(sync部分)
创建SampleChapters,用来填充数据。
代码: SampleChapters.cs
在宿主应用程序中,使用DI注册服务。
代码: Startup.cs
public void ConfigureServices(IServiceCollection services)
{
IMvcBuilder mvcBuilder = services.AddMvc();
mvcBuilder.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
#region 改变响应格式
mvcBuilder.AddXmlSerializerFormatters();
#endregion
#region 注册服务
// BookChaptersService作为单例注册,所以可以同时从多个线程访问它;
// 这就是为什么在实现中需要ConcurrentDictionary的原因
services.AddSingleton<IBookChaptersService, BookChaptersService>();
services.AddSingleton<SampleChapters>();
#endregion
}
调用SampleChapters,以便检索。
代码: Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env,SampleChapters sampleChapters)
{
//..
sampleChapters.CreateSampleChapters();
}
代码:BookChaptersController.cs
返回XML——配置如下:
//改变响应格式
[Produces("application/json","application/xml")]
[Route("api/[controller]")]
// [ApiController]
public class BookChaptersController : Controller
{
}
public void ConfigureServices(IServiceCollection services)
{
IMvcBuilder mvcBuilder = services.AddMvc();
mvcBuilder.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
#region 改变响应格式
mvcBuilder.AddXmlSerializerFormatters();
#endregion
#region 注册服务
// BookChaptersService作为单例注册,所以可以同时从多个线程访问它;
// 这就是为什么在实现中需要ConcurrentDictionary的原因
services.AddSingleton<IBookChaptersService, BookChaptersService>();
services.AddSingleton<SampleChapters>();
#endregion
}
HTTP方法返回的结果:
Http Method | Description | Request Body | Response Body |
---|---|---|---|
GET | 返回资源 | Empty | The resource |
POST | 增加资源 | The resource to add | The resource |
PUT | 更新资源 | The resource to update | None |
DELETE | 删除资源 | Empty | Empty |
下表显示了重要的HTTP状态代码 。Controller方法返回的实例化对象(带有状态代码)。如果想返回任意的HTTP状态代码,可以返回一个HttpStatusCodeResult对象,该对象可以使用自己需要的状态代码进行初始化:
Http Status Code | Controller Method | Type |
---|---|---|
200 OK | Ok | OkResult |
201 Created | CreatedAtRoute | CreatedAtRouteResult |
204 No Content | NoContent | NoContentResult |
400 Bad Request | BadRequest | BadRequestResult |
401 Unauthorized | Unauthorized | UnauthorizedResult |
404 Not Found | NotFound | NotFoundResult |
Any status code | StatusCodeResult |
由于许多技术(例如使用HttpClient类调用其他服务)仅提供异步方法。 所以会有异步服务。
定义服务接口
代码: IBookChaptersService.cs(async部分)
定义服务,用于检索,添加和更新书籍章节。
代码: BookChaptersService.cs(async部分)
BookChaptersService类实现异步方法。 从字典读取和写入时,不需要异步功能,因此Task使用FromResult方法创建返回值。
发送请求、从客户端接受数据。包括GET、POST、PUT、DELETE。
返回Json和xml格式的字符串。
创建UrlService——提供基地址与uri
代码: UrlService.cs
创建泛型类HttpClientService,以便为不同的数据类型使用一个实现。
代码: HttpClientService.cs
创建Model——BookChapter
代码: BookChapter.cs
创建客户端类,进行对HttpClientService的调用
代码: SampleRequestClient.cs
注册服务、调用SampleRequestClient
代码: Program.cs
创建DbContext
代码: DbContext.cs
创建DBBookChaptersService代替BookChaptersService
代码: DBBookChaptersService.cs
注册服务——配置ConfigureServices
代码: Startup.cs
配置连接字符串
代码: appsettings.json
添加NuGet——Swashbuckle.AspNetCore
public void ConfigureServices(IServiceCollection services)
{
// ...
// OpenAPI
services.AddSwaggerGen(options =>
{
//options.DescribeAllEnumsAsStrings();
options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info
{
Title = "Azure Adapter Api - Catalog HTTP API",
Version = "v1",
Description = "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
TermsOfService = "Terms Of Service"
});
});
//...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,SampleChapters sampleChapters)
{
// ...
// OpenAPI
app.UseSwagger().UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
}
ASP.NET Core支持2.1版的开放数据协议(OData)。OData通过HTTP协议提供对数据源的CRUD访问。
在本章中,您已经看到了映射到控制器中的Action方法的HTTP方法。 OData基于JSON和AtomPub(XML格式)构建,用于数据序列化。OData提供的更多功能是可以使用简单的URI查询访问每个资源。
定义Model—Book、BookChapter
代码: Book.cs
代码: BookChapter.cs
定义DBContext—BooksContext
代码: BooksContext.cs
定义Service—CreateBooksService
代码: CreateBooksService.cs
注册服务
代码: Startup.cs中配置ConfigureServices
配置中间件
代码: Startup.cs中配置Configure
定义Controller-BooksController、ChaptersController
[代码: BooksController.cs]](https://github.com/StarGuideX/Professional_Web_Demo/blob/master/WebAPISamples/WebAPIOdataSamples/Controllers/BooksController.cs)
[代码: ChaptersController.cs]](https://github.com/StarGuideX/Professional_Web_Demo/blob/master/WebAPISamples/WebAPIOdataSamples/Controllers/ChaptersController.cs)
http://localhost:56749/odata/Books
{"@odata.context":"http://localhost:56749/odata/$metadata#Books","value":[{"Id":1,"Isbn":"978-1-119-44927-0","Title":"Professional C# 7 and .NET Core 2","Publisher":"Wrox Press"},{"Id":2,"Isbn":"978-1-119-09660-3","Title":"Professional C# 6 and .NET Core 1.0","Publisher":"Wrox Press"},{"Id":3,"Isbn":"978-1-118-83303-2","Title":"Professional C# 5 and .NET 4.5.1","Publisher":"Wrox Press"}]}