【问题标题】:Difference between returning IHttpActionResult and returning an object [duplicate]返回 IHttpActionResult 和返回对象之间的区别 [重复]
【发布时间】:2017-07-18 04:46:17
【问题描述】:

当了解 API 时,我通常将它们编写在从 IHttpActionResult 接口返回一个方法(例如 OK())并将返回的对象作为参数放置在 OK() 方法中的位置。或者我可以只返回我从数据库中检索到的对象。

示例代码:使用 IHttpActionResult

[Route("GetAll1")]
[HttpGet]
public IHttpActionResult GetAll1()
{
    List<ContactWebLink> contactWebLinks = new List<ContactWebLink>();
    try
    {
         Manager<ContactWebLink> contactWebLinkManager = new Manager<ContactWebLink>(Unit);
         contactWebLinks = contactWebLinkManager.FindAll(a => a.IsDeleted == false, null, null, null);
         return Ok(contactWebLinks);
    }
    catch
    {
         return InternalServerError();
    }
    finally
    {
         contactWebLinks = null;
    }
 }

Vs 使用我要返回的对象的类

[Route("GetAll2")]
[HttpGet]
public List<ContactWebLink> GetAll2()
{
    List<ContactWebLink> contactWebLinks = new List<ContactWebLink>();
    try
    {
        Manager<ContactWebLink> contactWebLinkManager = new Manager<ContactWebLink>(Unit);
        contactWebLinks = contactWebLinkManager.FindAll(a => a.IsDeleted == false, null, null, null);
        return contactWebLinks;
    }
    catch
    {
        return null;
    }
    finally
    {
        contactWebLinks = null;
    }
}

使用 Postman 测试结果,我看到了任何差异。两者都会导致 200 响应代码(当没有异常发生时)。两者都返回相同的结果(我从数据库中检索的实体)。

那么使用这两种方法有什么区别,什么时候应该使用一种而不是另一种呢?

【问题讨论】:

    标签: c# json asp.net-mvc api postman


    【解决方案1】:

    我建议使用IHttpActionResult。您说得对,在成功的情况下,没有区别。当出现错误时,您可以通过返回更准确的代码来为客户提供更多信息。

    例如,您使用InternalServerError (500)。你可以给出更丰富的错误:

       return      
           ResponseMessage(
               Request.CreateErrorResponse(
                   HttpStatusCode.InternalServerError, 
                   "There has been an error on the server regarding X"));
    

    您也可以返回几乎任何 REST 代码。

    【讨论】:

    • 我将IHttpActionResult 比作使用隐式var 而不是显式类型。重构变得容易多了。
    【解决方案2】:

    您可以在使用IHttpActionReslt 时设置HTTP 状态码,例如返回对象和200(成功),或204 和无内容,或自定义错误消息等。

    例如

    BadRequest("Item not found");//404
    
    Ok(myObject);//200
    

    或者您可以指定状态码,例如:

    return StatusCode(HttpStatusCode.NoContent);
    

    【讨论】:

    • 这是我在使用 IHttpActionReslt 时获得的唯一好处吗?
    • 在我看来这是一个很大的好处
    • 但两者都返回相应的 HTTP 状态码。
    • 您可以自己指定状态码
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 2014-04-09
    • 2015-01-25
    • 2017-01-05
    • 2016-10-20
    • 2013-06-27
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多