Asp.net6WebAPI返回错误码

一赫技术 2024-04-04 08:31:07
摘要

HTTP状态码是Web开发中的一个重要组成部分,它指示了请求的成功或失败以及可能出现的问题。HTTP协议定义了五种不同类型的状态码,分别是1xx(信息性状态码)、2xx(成功状态码)、3xx(重定向状态码)、4xx(客户端错误状态码)和5xx(服务器错误状态码)。每种状态码都有不同的意义和用途,可以帮助开发人员快速诊断问题并提供更好的用户体验。

在HTTP请求/响应模型中,服务器根据请求的内容返回相应的状态码。客户端会根据返回的状态码来判断请求是否成功,并采取相应的措施。HTTP状态码并不能完全表示业务层面的错误码,因为HTTP状态码是基于请求/响应模型构建的。

应用场景

在设计和实现Web API时,正确地返回错误码对于提供清晰、一致的API使用体验至关重要。HTTP状态码提供了一种标准化的方式来表示服务器处理请求的结果,其中包括了多种错误情况。以下是一些常见的HTTP状态码,以及在Web API中使用它们来表示特定类型错误的指导原则:

1. 400 Bad Request

当客户端发送的请求有语法错误,或者请求的内容不符合API的预期时,应该返回400 Bad Request。这通常意味着客户端需要修改请求后再尝试。

示例场景:客户端提交的表单数据缺少必填项。

2. 401 Unauthorized

当请求需要用户的身份验证,而请求中没有提供该验证信息,或者提供的认证信息无效时,应该返回401 Unauthorized。

示例场景:客户端尝试访问需要登录的资源,但没有提供认证令牌。

3. 403 Forbidden

即使客户端提供了有效的认证信息,但它仍然没有权限访问特定的资源时,应该返回403 Forbidden。

示例场景:一个普通用户尝试访问只有管理员权限才能访问的资源。

4. 404 Not Found

当客户端尝试访问的资源不存在时,应该返回404 Not Found。

示例场景:客户端尝试通过ID获取一个不存在的用户信息。

5. 405 Method Not Allowed

当客户端尝试的HTTP方法不被允许或不支持时,应该返回405 Method Not Allowed。

示例场景:API不支持对特定资源进行PUT请求。

6. 409 Conflict

当请求与服务器的当前状态冲突时,应该返回409 Conflict。

示例场景:客户端尝试创建一个已存在的用户。

7. 500 Internal Server Error

当服务器遇到错误,无法完成请求时,应该返回500 Internal Server Error。这通常表示服务器内部出现了问题。

示例场景:服务器代码中发生了未捕获的异常。

8. 503 Service Unavailable

当服务器无法处理请求,通常是因为过载或停机维护时,应该返回503 Service Unavailable。

示例场景:服务器因维护暂时无法处理请求。

在ASP.NET Core Web API中返回这些状态码的一种方式是使用IActionResult接口,例如:

[HttpGet("{id}")]public IActionResult GetItem(int id){ var item = FindItemById(id); if (item == null) { return NotFound(); // 返回404 Not Found } return Ok(item); // 返回200 OK和项目数据}

通过正确使用HTTP状态码,你的Web API不仅能提供更丰富的错误信息,还能帮助客户端开发者更有效地处理错误情况。

状态码

400状态码通过网关监控HTTP状态码,如果发现频繁出现4xx状态码,那么就表明客户端代码存在问题,需要进行修复。许多系统的设计都是根据HTTP状态码的不同含义进行的。如果服务器端返回的状态码仍然是200,即使出现了失败的情况,这就违背了软件设计的初衷。

状态码

名称

说明

400

Bad Request

表示其他错误,就是4xx都无法描述的前端发生的错误

401

Authentication

表示认证类型的错误

403

Authorization

表示授权的错误(认证和授权的区别在于:认证表示“识别前来访问的是谁”,而授权则是“赋予特定用户执行特定操作的权限”)

404

Not Found

表示访问的数据不存在

405

Method Not Allowd

表示可以访问接口,但是使用的HTTP方法不允许

406

Not Acceptable

表示API不支持前端指定的数据格式

408

Request Timeout

表示前端发送的请求到服务器所需的时间太长

409

Confilct

表示资源发生了冲突,比如使用已被注册邮箱地址注册时,就引起冲突

410

Gone

表示访问的资源不存在。不单表示资源不存在,还进一步告知该资源该资源曾经存在但目前已消失

413

Request Entity Too Large

表示请求的消息体过长而引发的错误

414

Request-URI Too Large

表示请求的首部过长而引发的错误

415

Unsupported Media Type

表示服务器端不支持客户端请求首部Content-Type里指定的数据格式

416

Range Not Satisfiable

表示无法提供Range请求中的指定的那段包体

417

Expectation Failed

表示对于Expect请求头部期待的情况无法满足时的响应码

421

Misdirected Request

表示服务器认为这个请求不该发给它,因为它没能力处理

426

Upgrade Required

表示服务器拒绝基于当前HTTP协议提供服务,通过Upgrade头部告知客户端必须升级协议才能继续处理

428

Precondition Required

表示用户请求中缺失了条件类头部,例如If-Match

429

Too Many Requests

表示客户端发送请求的速率过快

431

Request Header Fields Too Large

表示请求的HEADER头部大小超出限制

451

Unavailable For Legal Reasons

表示由于法律原因不可访问

500状态码状态码表示错误由服务器端的问题引发的。

状态码

名称

说明

500

Internal Server Error

表示服务器内部错误,且不属于以下错误类型

501

Not Implemented

表示服务器不支持实现请求所需要的功能

502

Bad Gateway

代理服务器无法获取到合法资源

503

Service Unavailable

服务器资源尚未准备好处理当前请求

504

Gateway Timeout

表示代理服务器无法及时的从上游获得响应

505

HTTP Verson Not Supported

表示请求使用的HTTP协议版本不支持

507

Insufficient Storage

表示服务器没有足够的空间处理请求

508

Loop Detected

表示访问资源时检测到循环

511

Network Authentication Required

表示代理服务器发现客户端需要进行身份验证才能获得网络访问权限

200状态码请确保在处理网络问题和业务问题时进行区分。虽然网络错误可能会对业务产生影响,但这两者应该分开记录和解决。建议将系统日志和业务日志分开存储和管理,以便更好地跟踪和诊断问题。

建议

对于服务器错误,请求报文格式,等非业务错误,返回5xx等状态码。

对于业务层面错误,4xx等返回HTTP状态码,配合返回具体错误消息,一般用JSON返回

var ret = new{ code = 101, message = "保存数据出错"};写一个Result类public Result{ public int Code { get; set; } public string Message { get; set; } public object Data { get; set; } public Result() { } public Result(int code,string message,object data) { this.Code = code; this.Message = message; this.Data= data; }}
0 阅读:0

一赫技术

简介:感谢大家的关注