适当返回Web API

时间:2016-06-16 15:42:26

标签: asp.net asp.net-web-api

我有一个ASP.NET核心控制器,它返回一个对象。让我们说这个对象是类型/类,Person。你调用API函数是一个问题,需要一个代表人名的参数。因此,API的目的是按名称返回单个人。如果找不到人,最佳做法回报是什么?我应该返回null吗?我应该返回/抛出异常吗?

return new ObjectResult(person); 
return NotFound(); // NotFound() is framework function - returns 404

我担心Not Found通常意味着在HTTP中找不到资源本身。可以/不应该发现也可以用来表示找不到被查询的对象吗?

1 个答案:

答案 0 :(得分:2)

正确的REST方法是返回HTTP 404状态代码。

Person是API上下文中的资源,所以应该没问题。 REST客户端和开发人员知道如何处理HTTP错误,404错误非常有意义。

你可以在404回复体中写一个理由,但我不会介意。

要进一步扩展REST API响应的HTTP状态代码的使用,如果您返回的是一个集合而不是单个对象,例如特定部门下的员工,您可以产生一个HTTP 204(NO CONTENT)状态(如果部门确实存在但其下没有员工(表示现有部门的空集),或者如果没有此类部门则为HTTP 404(未找到)状态。您应该始终记录API和返回的状态代码的语义。

另一种解决方法是使用标准化的JSON响应,其中包括成功/错误信息以及有效负载。例如,您所有的控制器" JSON" actions可以返回一个继承自this base classe的类:

public class ApiResponse {
    // I use lowercase properties so that the JSON follows common JavaScript naming conventions
    public bool success { get; set; }
    public String errorMessage { get; set; }
    public int? errorCode { get; set; }
}

返回此人的控制器方法可以使用以下内容:

public class GetPersonResponse : ApiResponse {
    public PersonModel person { get; set; }
}

在您的控制器中,您可以执行以下操作:

public GetPersonResponse Person(string id) {
    var person = FindPersonByName(id);
    var response = new GetPersonResponse {
        success = person != null,
        person = person
    }
    if (person == null) {
        response.errorCode = 404, // suggestion only
        response.errorMessage = "Person not found"
    }        
    return response;
}

由于JSON序列化程序不会序列化(默认情况下)null属性,因此上面的代码可以通过在未找到有效负载(人员)时序列化,或者如果没有序列化错误信息,则可以覆盖。