HTTP状态码

HTTP状态码会告诉API的消费者以下事情:

  • 请求是否执行成功了

  • 如果请求失败了,那么谁为它负责

HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码。HTTP状态码一共分为5个级别:

  • 1xx,属于信息性的状态码。Web API并不使用1xx的状态码。

  • 2xx,意味着请求执行的很成功。

    • 200 - Ok,表示请求成功;

    • 201 - Created,请求成功并创建了资源;

    • 204 - No Content,请求成功,但是不应该返回任何东西,例如删除操作。

  • 3xx,用于跳转。例如告诉搜素引擎,某个页面的网址已经永久的改变了。绝大多数的Web API都不需要使用这类状态码。

  • 4xx,客户端错误:

    • 400 - Bad Request,表示API消费者发送到服务器的请求是有错误的;

    • 401 - Unauthorized,表示没有提供授权信息或者提供的授权信息不正确;

    • 403 - Forbidden,表示身份认证已经成功,但是已认证的用户却无法访问请求的资源;

    • 404 - Not Found,表示请求的资源不存在;

    • 405 - Method not allowed,当尝试发送请求到资源的时候,使用了不被支持的HTTP方法时,就会返回405状态码;

    • 406 - Not acceptable,这表示API消费者请求的表述格式并不被Web API所支持,并且API不会提供默认的表述格式。例如请求的媒体类型是application/xml,但是Web API仅支持application/json类型,并且API不会将application/json作为默认格式提供;

    • 409 - Conflict,表示请求与服务器当前状态冲突。通常指更新资源时发生的冲突,例如,当你编辑某个资源的时候,该资源在服务器上又进行了更新,所以你编辑的资源版本和服务器的不一致。当然有时候也用来表示你想要创建的资源在服务器上已经存在了。它就是用来处理并发问题的状态码。

    • 415 - Unsupported media type,与406正好相反,有一些请求必须带着数据发往服务器,这些数据都属于特定的媒体类型,如果API不支持该媒体类型格式,415就会被返回。

    • 422 - Unprocessable entity,它是HTTP扩展协议的一部分。它说明服务器已经懂得了实体的Content Type,也就是说415状态码肯定不合适;此外,实体的语法也没有问题,所以400也不合适。但是服务器仍然无法处理这个实体数据,这时就可以返回422。所以它通常是用来表示语意上有错误,通常就表示实体验证的错误。

  • 5xx,服务器错误:

    • 500 - Internal server error,表示服务器出现了错误,客户端无能为力,只能以后再试试了。

错误和故障

系统时不时的会出现一些问题,这些问题可以划分为两类:错误和故障。

错误 Errors

错误通常是由API的消费者引起的。API消费者请求时传递的数据是不合理的,这时API就会正常的将其拒绝。例如,请求的凭证是不合理的,或者请求的参数不合理等等。

这些就是HTTP  4xx错误。

错误并不会影响API的可用性。

故障 Faults

故障是指,针对一个合理的请求,API无法返回它的响应。 换句话说就是API引起的问题。

这些是HTTP 5xx错误。

故障确实会对API整体的可用性造成影响。

ProblemDetails

当ASP.NET Core 大约在 2.1 版本的时候,它引入了 ProblemDetails。ProblemDetails是基于 RFC7807 这个规范,目的是让 HTTP 响应可以携带错误的详细信息,而不是只返回一个错误的状态码。

在 ASP.NET Core 2.2的时候,如果Controller使用了 [ApiController] 这个属性,那么 ProblemDetails 就是客户端错误码的标准响应。

例如,当返回类型为 IActionResult 的方法返回客户端错误状态码的时候(4xx),同时还会返回一个body,这个 body 就是 ProblemDetails。 这个结果里还会包含着一个相关的ID,使用这个ID,就可以把错误和相应的请求日志关联起来。

关于ProblemDetails这个类,可以查看:官方文档

为了使用ProblemDetails?

  • 需要为应用程序定义一个通用的错误显示格式;

  • 很多时候,只返回HTTP状态码并不能表达和传递出足够的信息。

在ASP.NET Core 3.x里面,同样也使用了 ProblemDetails。

看一个返回404的例子:

这是一个Get请求,但是并没有找到该资源,返回的状态码是404,而响应的body就是 ProblemDetails。

值得注意的是,这个响应的 Content-Type 是 application/problem+json:

使用ASP.NET Core 3.x 构建 RESTful API - 3.3 状态码、错误/故障、ProblemDetails的更多相关文章

  1. 使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

    1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文<Archit ...

  2. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作

    以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Co ...

  3. 使用ASP.NET Core 3.x 构建 RESTful API - 3.4 内容协商

    现在,当谈论起 RESTful Web API 的时候,人们总会想到 JSON.但是实际上,JSON 和 RESTful API 没有半毛钱关系,只不过 JSON 恰好是RESTful API 结果的 ...

  4. 使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索

    向Web API传递参数 数据可以通过多种方式来传给API. Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源. 共有以下六种 Binding Sou ...

  5. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由和HTTP方法

    ASP.NET Core 3.x 的路由 路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把 ...

  6. 使用ASP.NET Core 3.x 构建 RESTful API - 5.1 输入验证

    说到验证,那就需要做三件事: 定义验证规则 按验证规则进行检查 报告验证的错误.在把错误报告给API消费者的时候,报告里并不包含到底是服务端还是API消费者引起的错误,这是状态码的工作.而通常响应的B ...

  7. 使用ASP.NET Core 3.x 构建 RESTful API - 3.1 资源命名

    之前讲了RESTful API的统一资源接口这个约束,里面提到了资源是通过URI来进行识别的,每个资源都有自己的URI.URI里还涉及到资源的名称,而针对资源的名称却没有一个标准来进行规范,但是业界还 ...

  8. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model

    Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的. 而面向外部的 model 则表示了要传输的东西.这类 model 有时候叫做 Dto,有时 ...

  9. 使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性

    什么样的HTTP方法是安全的? 如果一个方法不会该表资源的表述,那么这个方法就被认为是安全的. 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的,但需要注意的是,这并不意味着执行GET ...

随机推荐

  1. 磁盘冗余阵列之RAID5的配置

    1988年由加利福尼亚大学伯克利分校发表的文章首次提到并定义了RAID,当今CPU性能每年可提升30%-50%但硬盘仅提升7%,渐渐的已经成为计算机整体性能的瓶颈,并且为了避免硬盘的突然损坏导致数据丢 ...

  2. python 类内部装饰器的实现 与 参数解构学习

    学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢, 在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj(): clas ...

  3. jstl-将List中的数据展示到表格中

    功能: 使用jstl将List中的数据动态展示到Jsp表格中,并实现隔行换色功能. 效果图: Jsp代码: <%@ page import="java.util.ArrayList&q ...

  4. 高性能Web动画和渲染原理系列(5)合成层的生成条件和陷阱

    目录 一. 硬件加速相关的几个概念 二. 合成层的生成条件 显式提升 隐式提升 三. 硬件加速的权衡 四. 动画实现的一些建议 示例代码托管在:http://www.github.com/dashno ...

  5. 微信小程序引入全局或公共样式

    在开发的过程中,总会遇到很多可复用性的样式,为了代码更加的简洁和减少微不住道的文件体积,我抽取了一部分的公共样式,并全局引入,不知是否妥当,如有更好的想法,欢迎一起探讨 在app.wxss中引入 然后 ...

  6. 微信web协议,群成员唯一uin,获取群成员唯一标识

    群成员唯一标识获取接口 全网最新,支持调试测试.觉得OK再付款! 800元出售源码 不讲价 联系QQ:2052404477

  7. Python3.7.1学习(三)求两个list的差集、并集与交集

    在python3.7.1对列表的处理中,会经常使用到Python求两个list的差集.交集与并集的方法. 下面就以实例形式对此加以分析. # 求两个list的差集.并集与交集# 一.两个list差集# ...

  8. 力扣(LeetCode)买卖股票的最佳时机 个人题解

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

  9. python:爬虫0

    什么是网页爬虫,也叫网页蜘蛛.把互联网比作一个蜘蛛网,有好多节点,这个蜘蛛在网上爬来爬去,对对网页中的每个关键字进行建立索引,然后建立索引数据库,经过复杂的排序算法后,这些算法的结果将按照相关度的高低 ...

  10. 就该这样理解 OSI 七层参考模型、浅谈不同局域网之间的通信

    简介 说到OSI参考模型,理解网络与网络之间的关系,不说太深入难以理解的东西,只求能最大程度上理解与使用. 参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为O ...