假设我有一个项目的详细信息页面:/ items / {id}。用户当然可以尝试任何随机ID,但如果他没有访问该项目,我会返回没有数据的详细信息页面,这不是很好。我宁愿只返回404或204。但是,使用Breeze Web API,我将返回IQueryable,因此我无法返回错误,并且我必须处理客户端上的空集。这样做最好的方法是什么?我正在考虑检查结果是否为空,然后重定向到自定义404页面,但是想知道是否有更好的方法?
由于
答案 0 :(得分: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);
}
答案 1 :(得分:1)
当您编写返回IQueryable的服务/ Web API控制器方法时,您已经有意识地决定您的HTTP资源是一个集合。该集合可能为空......但空集合与完整集合一样有效。找到了该集合,正确的响应是200,而不是404。
如果您的HTTP请求是针对特定项目的(例如..,您的端点设计为返回路径类似〜/ customers /:id的单个对象),则返回状态为404的HTTP响应说得通。如果您愿意,可以使用两种端点。 Breeze不会强迫你进入IQueryable。这只是一个选择。您可以混合使用这两种端点。
对我来说,更大的担忧是数据(客户)和UI(页面)之间可能存在混淆。 Web API没有返回页面;它正在返回数据。
我假设您正在构建一个具有详细信息屏幕的“单页应用程序”。如果导航到详细信息屏幕,尝试通过Id获取该屏幕的实体,并发现这样的实体不存在,您确实必须决定会发生什么。现在你必须决定去哪里。
该决定独立于HTTP状态代码。您可以将客户端屏幕重定向到安全位置(例如,客户列表),而无需担心HTTP状态代码。 HTTP状态代码是HTTP协议的一部分,用于通过Web进行通信。您的应用程序自己的客户端屏幕导航没有穿过Web,并且没有必要(也没有必要)采用该协议。
您应该很好地检测到Web API返回了一个空集合。没有尴尬。 HTTP警察不会逮捕你。只是适当地重新指导。