0

假设我有一个项目的详细信息页面:/items/{id}。用户当然可以尝试任何随机 id,但如果他无权访问该项目,我会返回没有数据的详细信息页面,这不是很好。我宁愿只返回 404 或 204 。但是,使用 Breeze Web API,我返回一个 IQueryable,所以我不能返回错误,我必须处理客户端上的空集。这样做的最好方法是什么?我正在考虑检查结果是否为空,然后重定向到自定义 404 页面,但想知道是否有更好的方法?

谢谢

4

2 回答 2

1

当您编写返回 IQueryable 的服务/Web API 控制器方法时,您有意识地决定您的 HTTP 资源是一个集合。集合可能是空的……但空集合与完整集合一样有效。找到集合,正确的响应是 200,而不是 404。

如果您的 HTTP 请求是针对特定项目的(例如,您有一个端点旨在返回其路由类似于 ~/customers/:id 的单个对象),那么返回状态为 404 的 HTTP 响应是有意义的。如果您愿意,您可以同时拥有这两种端点。Breeze 不会强迫您使用 IQueryable。那只是一种选择。您可以混合使用这两种端点。

对我来说,更大的担忧是数据(客户)和 UI(页面)之间可能存在的混淆。Web API 没有返回页面;它正在返回数据。

我假设您正在构建一个具有详细信息屏幕的“单页应用程序”。您确实必须决定如果您导航到详细信息屏幕会发生什么,尝试通过 Id 获取该屏幕的实体,并发现这样的实体不存在。现在你必须决定去哪里。

该决定与 HTTP 状态代码无关。您可以将客户端屏幕重定向到安全位置(例如,客户列表),而无需担心 HTTP 状态代码。HTTP 状态代码是用于通过 Web 进行通信的 HTTP 协议的一部分。您的应用程序自己的客户端屏幕导航不会跨越网络,因此没有必要(也没有意义)采用该协议。

您应该很好地检测到 Web API 返回了一个空集合。没有尴尬。HTTP 警察不会逮捕你。只需根据需要重新定向即可。

于 2013-08-14T06:56:46.690 回答
1

您可以像这样在 IQueryable 方法中抛出 404 错误

[HttpGet]
public IQueryable<Customer> CustomersWithHttpError() {
  // throw new HttpResponseException(HttpStatusCode.NotFound);
  var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound);
  responseMsg.Content = new StringContent("Custom error message");
  responseMsg.ReasonPhrase = "Custom Reason";
  throw new HttpResponseException(responseMsg);
}
于 2013-08-12T23:01:23.500 回答