【问题标题】:API Record not found未找到 API 记录
【发布时间】:2020-06-24 18:08:30
【问题描述】:

我构建了这个 API,如果找到该 Id,它将返回数据。但是,如果找不到该 ID,我将返回 409。当我在邮递员中对其进行测试时,我看到状态为 409 是否正确?这就是我所需要的,还是应该在正文中返回一些文本?

    [HttpGet]
    public IHttpActionResult Read(string type, string id)
     {
        if (id== null)
        {
           var msg = new HttpResponseMessage(HttpStatusCode.NotFound) { ReasonPhrase = "Unable to Find Id" };
msg.Content= new StringContent($"No entity with {id} was found");
           return ResponseMessage(msg);
        }
     }

【问题讨论】:

  • 我看到 404 的状态是正确的吗? 是的……您需要做的就是阅读文档:创建一个 NotFoundResult 产生一个 Status404NotFound 响应.
  • 404 是“未找到”大多数浏览器的正确 HTTP 代码,并且基于此内容将显示“未找到”。可以构造带有特定错误消息的“未找到”结果,但没有超级简单的内置方法,请参阅:stackoverflow.com/questions/20139621/…
  • 顺便说一下,虽然返回“NotFound”是技术上正确的,但请考虑您的设计,因为只有 404 并不能告诉我我的 type未找到,我的 id 未找到,或者即使我只是错误地输入了 URI(因为尝试对 http://yourapi/dummyroute 进行 GET 操作也会给出找不到整个 route 的 404...我现在更喜欢返回一个更明确的数据类型,其属性指示成功或失败。
  • 顺便说一句,您返回时未找到,如果您看到 409,则说明有问题。

标签: c# asp.net-web-api2


【解决方案1】:

您确实会看到“未找到”文本:

您在正文中看不到任何内容,因为您的 API 不发送正文,只是发送 HTTP 标头

您的评论,并在 GPW 的建议中链接,返回一些自定义的东西 - 让错误成为错误,并将这种可预见的情况作为“OK 但没有”响应,也许:

[HttpGet]
public ActionResult Read(string type, string id)
 {
    if (id == null)
       return Json(new { status= "fail", message= "id parameter is required" });
    else if (type == null)
       return Json(new { status= "fail", message= "type parameter is required" });


    var ent = dbcontext.Entity.FirstOrDefault(e => e.Type == type && e.Id == id);

    if(ent == null)
      return Json(new { status="fail", message= "No entity with that type/id was found" });
    else
      return Json(new { status="ok", entityName= ent.Name });

 }

在我们的一个应用程序中,我们确实使用 HTTP 错误来改变客户端的行为 - 在客户端 react 应用程序中有一个承诺链,我们使用返回错误来停止链的处理,解析错误,然后继续回到解析知道 JSON 是一个稍微不同的形状。我不相信这是一个很好的方法,因为它使客户端比它本来可以做的更复杂,但是如果你想这样做,那么确定,看看返回有意义的 http 错误的方法。就个人而言(和 GPW 暗示它)甚至调试,很多时候我错过了邮递员的返回码,得到一个空白的响应,被误导,除了实际发生的事情之外还有其他错误/得到 404 并认为后端不能'实际上我弄错了 URL 并且由于不同的原因得到 404 等时找不到实体

【讨论】:

  • 你可以;但话又说回来,你可以做任何事情。 GPW 给出了明智的建议。我会进行编辑
  • 这是使用 IHttpActionResult 可以返回 JSON
  • 当然,看看docs.microsoft.com/en-us/aspnet/web-api/overview/… 中的最终示例 - 方法被声明为返回一个 IEnumerable 并且响应最终为 JSON.. 我不打算让我的代码成为代替你的,这是为了说明一个概念,对于那些可预见的问题,比如 ID 为空或在数据库中找不到,一切都应该没问题
  • 我会返回类似这样的内容吗 var msg = new HttpResponseMessage(HttpStatusCode.NotFound) { ReasonPhrase = $"No entity with {id} was found"};我没有看到失败
  • 呃..没有。我主张你返回一个 OK(因为 http 请求成功了;它到达并被解析,提供的数据存在应用程序/逻辑级别问题,并且响应正确发送),正文显示“失败”并给出理由。您非常坚决地返回一个 HTTP 错误(本身就是一个相当低级的事情)来传达应用程序逻辑的失败(本身就是一个相当高级的事情)。我的意思是“在应用程序无法控制的情况下保留 HTTP 错误,并为应用程序逻辑流程中的错误使用好/坏状态”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2012-05-20
  • 2019-10-31
相关资源
最近更新 更多