用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它 (4)

如果达到限制了,这些响应会返回429 Too many requests 状态码。有可能会包含一个Retry-After 响应Header,而响应的body应该包含解释当前状态的细节信息。当然这都是理论上要求的。

 

下面去实现,首先安装这个库 AspNetCoreRateLimit (https://github.com/stefanprodan/AspNetCoreRateLimit):

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

首先在Startup的ConfigureServices里面注册,用到了MemoryCache:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

这里配置的是IP限制,它允许有很多规则,这里我只用了一个:针对所有的资源,每5分钟最多3次请求。

现在,我需要注册一个策略存储和速率限制计数器的存储,这两个是被中间件使用。所以还需要注册这两个服务:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

这里都使用的是Singleton单例,因为我们需要的是针对全局的请求来做操作。

接下来要在管道里添加中间件,它应该放在靠前的位置,在日志和异常之后:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

 

测试,发送一个请求看结果:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

可以看到5分钟内还剩下两次请求的配额。限制重置的时间大约在5分钟之后。

发送请求超限之后,就会返回429:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

Retry-After提示了再过294秒后可以再试试。。。

而响应的body是这样提示的:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

 

我们再组合几个其它的规则:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

现在允许5分钟10次请求,但是每10秒钟最多只能有两次请求。

第一次请求后:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

5分钟内还剩9次,然后我10秒内连续发送两次请求,然后再发送一次请求:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

这时超出了限制,Header里:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

提示6秒后可以重试, 6秒后再次发送请求:

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

 

这个库还是挺灵活强大的,更多功能还需要看官方文档。

 

API 文档

业界通常会使用Swagger OpenAPI来对RESTful API进行格式化描述,而Swagger OpenAPI的当前版本是v3.

ASP.NET Core有一个第三方库Swashbuckle,它支持Swagger,但是只支持版本2,版本2有个重要的缺陷就是不支持Action重载,之前HATEOAS的文章里提到过我们需要使用这种重载。所以Swashbuckle暂时并不是完全合适,所以我就不装它了。

就暂时不弄自动文档了。。。

 

单元测试

需要使用到xUnit和Moq,这里不介绍了。

关于xUnit,我写过几篇文章,有兴趣可以参考下:

 

Moq的文章博客园应该有,如果需要的话,我可以写一下。

 

其它

其它可能需要了解的包括:POSTMAN/Newman自动化测试,CI,CD,GraphQL等等。我就不介绍了

 

这个系列文章就到这了。

源码(我还需要整理一下源码,现在有点乱):https://github.com/solenovex/ASP.NET-Core-2.0-RESTful-API-Tutorial

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

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

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