向Web API传递参数 数据可以通过多种方式来传给API. Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源. 共有以下六种 Binding Source Attributes: [FromBody] 请求的 Body [FromForm] 请求的 Body 中的 form数据 [FromHeader] 请求的 Header [FromQuery] Query string 参数 [FromRoute] 当前请求中的路由数据 [FromServ…
1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文<Architectural Styles and the Design of Network-based Software Architecture>中提出的.他在本文中创造了REST这个术语.这篇论文的地址是:https://www.ics.uci.edu/~fielding/pubs/dissertation/…
以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Core不了解,就可以先看一下里面的基础知识和API相关的内容,地址是:https://www.bilibili.com/video/av65313713/. 预备知识:ASP.NET Core 和 C# 工具:Visual Studio 2019最新版(VSCode.VS for Mac,Rider等…
现在,当谈论起 RESTful Web API 的时候,人们总会想到 JSON.但是实际上,JSON 和 RESTful API 没有半毛钱关系,只不过 JSON 恰好是RESTful API 结果的表述格式.也就是说 RESTful API 还可以使用其它的表述格式,例如 xml 或私有的格式.这也就意味着,我们需要让 RESTful API 知道我们想要返回的格式.而这就是HTTP请求和响应的核心内容之一: Content Negotiation 内容协商 内容协商是这样一个过程:针对一个响…
ASP.NET Core 3.x 的路由 路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把它映射到一个Controller上面的Action. 两个路由中间件 在ASP.NET Core 3.x里面,建议使用Endpoint路由来进行设置.但是我们需要先在请求的管道里面添加两个中间件: app.UseRouting().它是用来标记路由决策在请求管道里发生的位置,也就是在这里会选择端点.…
HTTP状态码 HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一共分为5个级别: 1xx,属于信息性的状态码.Web API并不使用1xx的状态码. 2xx,意味着请求执行的很成功. 200 - Ok,表示请求成功: 201 - Created,请求成功并创建了资源: 204 - No Content,请求成功,但是不应该返回任何东西,例如删除操作. 3xx,用…
说到验证,那就需要做三件事: 定义验证规则 按验证规则进行检查 报告验证的错误.在把错误报告给API消费者的时候,报告里并不包含到底是服务端还是API消费者引起的错误,这是状态码的工作.而通常响应的Body里面会包含一组验证错误信息,API消费者可以把这些信息展示给API消费者的用户. 定义验证规则 想要定义验证规则,我们可以使用ASP.NET Core内置的方式或者使用第三方库. 在ASP.NET Core里面,验证规则可以通过以下的方式来进行定义: Data Annotations.例如 […
之前讲了RESTful API的统一资源接口这个约束,里面提到了资源是通过URI来进行识别的,每个资源都有自己的URI.URI里还涉及到资源的名称,而针对资源的名称却没有一个标准来进行规范,但是业界还是有一些最佳实践的.那么我们首先看看这些最佳实践对资源命名是如何建议的. 资源命名 下面让我们来看看RESTful API资源命名的一些最佳实践. 使用名词,而不是动词 一个资源的URI代表的是一个实际上或概念上存在的东西,因此,它应该是名词,所以也就不应该出现动词,动词应该使用HTTP方法来表达.…
Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的. 而面向外部的 model 则表示了要传输的东西.这类 model 有时候叫做 Dto,有时候叫做 ViewModel. 举一个例子,人员的Entity Model如下: 最后一个字段表示人员的出生日期. 而它的面向外部的model:PersonDto是这样的: 而API消费者并不需要人员的出生日期,它只是需要人员的年龄,所以在PersonDto里面没有DateOfBirth这个字段,取而…
什么样的HTTP方法是安全的? 如果一个方法不会该表资源的表述,那么这个方法就被认为是安全的. 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的,但需要注意的是,这并不意味着执行GET请求就不会引起其它的资源操作,在表面之下,你的服务层有可能会对其它相关的一些表的数据做出修改,但是本资源的表述不应该被改变.但即使相关的一些数据被修改了,这也不是API消费者所请求的事. 什么是HTTP方法的幂等性? 如果一个方法执行多次和执行一次的结果(带来的副作用)是一样的话,那么这个方法就被认…