繁体   English   中英

ASP.NET Core Web API 响应 - 状态代码与自定义对象

[英]ASP.NET Core Web API response - status codes vs custom object

我在我的 Web API 项目中实现了Response逻辑,响应对象如下所示:

public class Response
{
    public bool IsSuccess { get; set; }
    public object Data { get; set; }
    public string Message { get; set; }
}
  • IsSuccess指示调用是成功还是失败。
  • Datatrue时用于进一步处理的IsSuccess
  • Messagefalse时用于进一步处理的IsSuccess

我有几个问题。 请帮我解决一下这个。

  • 可以在状态代码上使用自定义对象吗?
  • 这种方法会有什么缺点?
  • 我应该改用状态代码/ ControllerBase返回方法吗?

HTTP 状态码是一种标准。 参见例如这个文档 没有人期望在 IsSuccess 设置为 false 的情况下获得 200 OK,因为 200 OK 表示成功。 3xx 是重定向,4xx 是客户端错误,5xx 是服务器错误。 坚持这一点,不要重新发明轮子,你会混淆你的 API 的客户端。

但是,您可以在回复中包含更多自定义信息,而且这是一种很好的做法。 定义您的响应,例如:

public class ErrorDetails
{
    public string Message { get; set; }
}

比直接在.net的响应对象上设置响应代码,而不是你自己:

var error = new ErrorDetails { ... };
context.Response.StatusCode = 4xx / 5xx; // and not 200, it's an error! context is HttpContext
await context.Response.WriteAsync(JsonConvert.SerializeObject(error));

控制器方法已经为此提供了内置方法,因此也无需像上面的示例中那样艰难地进行操作。 例如:

this.BadRequest(error);

这将在响应对象上设置 404 并将您的错误对象作为附加数据传递到有效负载中。 每种情况都有 this.Ok() 和一堆其他方法。

HTTP 已经标准化了表示请求和响应的结构。 在这种情况下,响应包含 3 个部分 - 状态、标题和正文。 请参考这里 每个部分都有明确的目的。 由于问题是关于状态码的,我会限制自己。

状态码的主要目的是表明请求是否被正确处理。 自动化系统和脚本依赖于它来分支他们的决策。

重要的是要记住,定义的模型将成为响应主体的一部分。 这意味着构建的框架 API 仍将包含默认响应代码 - 通常,它是 200 OK。 如果 IsStatus 属性应该充当状态代码的替代品,如果不采取适当的措施,当 API 出错时,状态代码和 IsStatus 可能会显示不同的值。

最后,我认为你最好用一个 ErrorResponse 来代替。 有点像——

public class ErrorResponse{
    // Application or Service specific code 
    // to identify the error
    public string Code {get; set;}

    // A link to detailed description of the
    // of the error
    public Uri Info {get; set;}

    // A high level friendly message about the
    // error
    public string Message {get; set;}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM