在 .NET Core 中构建 REST API (3)

可以通过修改 Query,让搜索进入条件块内。请注意我用了 StartsWith 和 InvariantCultureIgnoreCase 来简化产品过滤,在实际的 SQL 中,可以使用 LIKE 运算符,还可以通过排序规则设置不区分大小写。

要测试分页和此新过滤器,请使用 curl 执行以下命令:

curl -i -X GET "http://localhost:5000/v1/products?offset=15&department=electronics" -H "accept: application/json"

检查确定包含总数和受支持版本号的 HTTP 头:

HTTP/1.1 200 OK Date: Thu, 28 Jan 2021 11:19:09 GMT Content-Type: application/json; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked x-total-count: 155 api-supported-versions: 1.0 日志记录和 API 文档

当 API 成形后,如何向其他开发人员传达 Endpoints 呢?对于团队来说,在不破坏开放代码的情况下了解 API 公开的内容是有好处的。Swagger 是这里的首选工具,它能通过反射,自动生成可用的文档。

如果我告诉您,Swagger 所需的一切都已经在此 API 中设置过了呢?来吧,再看一眼:

[Produces("application/json")] [ProducesResponseType(StatusCodes.Status200OK)] ActionResult<IQueryable<Product>> GetProducts([FromQuery] string department, [FromQuery] ProductRequest request)

ASP.NET 属性对于 Endpoints 的自文档化非常有用。Swagger 通过反射,从控制器方法中获得返回类型,进而推断响应该是什么样子,并获得每个控制器方法的请求参数。因为它收集了工作代码中的所有内容,所以可以生成“活文档”,从而减少了故障的发生。

通过 NuGet 获取缺少的依赖项:

dotnet add package Swashbuckle.AspNetCore

并在 ConfigureServices 中将其关联进来:

services.AddSwaggerGen(c => c.SwaggerDoc("v1", new OpenApiInfo { Title = "Products", Description = "The ultimate e-commerce store for all your needs", Version = "v1" }));

然后,在 Configure 中启用它:

app.UseSwagger(); app.UseSwaggerUI(opt => opt.SwaggerEndpoint("/swagger/v1/swagger.json", "Products v1"));

注意 OpenApiInfo 来自 Microsoft.OpenApi.Models 命名空间。

此时,在浏览器中导航到 :5000/swagger 就可以查看 swagger 文档了。

页面大概如下显示:

swagger page

在 swagger 文档中,您可以轻松浏览 API 并通过这个工具向 API 发起请求,您所在组织的其他开发人员会因此受益而轻松愉快,他们甚至可能会请您喝杯咖啡。

展开 GET /Products 查看从控制器方法中提取的 C# 数据类型:

swagger page

下一站是日志记录。我将使用 NLog 在后端存储日志,使得 API 能够保存日志以供进一步分析。在实际环境中,日志对于故障排除非常有用;另外,它们还可以帮助收集遥测数据,以帮助了解 API 在未知状态下的使用情况。

要设置日志记录器,需要完成做以下操作:

一个 NuGet 包

一个 nlog.config 设置文件

修改 Program 类

微调 appsettings.json

安装 NuGet 包:

dotnet add package NLog.Web.AspNetCore

设置的 nlog.config 文件可以如下:

<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="false" throwConfigExceptions="false" autoReload="true" internalLogLevel="Warn" internalLogFile= "C:\temp\BuildRestApiNetCore\RestApi-internal-nlog.txt"> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <targets async="true"> <target xsi:type="File" fileName= "C:\temp\BuildRestApiNetCore\RestApi-${shortdate}.log"> <layout xsi:type="JsonLayout"> <attribute layout="${longdate}" /> <attribute layout="${uppercase:${level}}" /> <attribute layout="${logger}" /> <attribute layout="${aspnet-mvc-action}" /> <attribute layout="${message}" /> <attribute layout="${exception:format=tostring}" /> </layout> </target> </targets> <rules> <logger maxlevel="Info" final="true" /> <logger minlevel="Info" writeTo="ownFile-web" /> </rules> </nlog>

请注意 Layout,因为它设置了日志文件的类型,这里将其设置为 JsonLayout。当在不同的分析工具中使用日志文件时,JSON 格式具有最大的灵活性。为了让冗余降到最小,记录器规则不记录来自 Microsoft.* 的错误。另外,因为将 throwExceptions 设置为了 false,API 中未处理的异常会被记录,但不会被重新抛出。这里的用法可能是多变的,但通常最好是在 logger 中处理所有未处理的异常。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxjsd.html