我有一个ASP.NET核心控制器,它返回一个对象。让我们说这个对象是类型/类,Person。你调用API函数是一个问题,需要一个代表人名的参数。因此,API的目的是按名称返回单个人。如果找不到人,最佳做法回报是什么?我应该返回null吗?我应该返回/抛出异常吗?
return new ObjectResult(person);
return NotFound(); // NotFound() is framework function - returns 404
我担心Not Found通常意味着在HTTP中找不到资源本身。可以/不应该发现也可以用来表示找不到被查询的对象吗?
答案 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属性,因此上面的代码可以通过在未找到有效负载(人员)时序列化,或者如果没有序列化错误信息,则可以覆盖。