我正在用C# (.ashx文件)编写一个JSON服务。在对服务的成功请求中,我返回一些JSON数据。如果请求失败,无论是因为抛出了异常(例如,数据库超时),还是因为请求在某种程度上是错误的(例如,给出了一个不存在于数据库中的ID作为参数),服务应该如何响应?哪些HTTP状态代码是合理的,我应该返回任何数据吗?
我预计服务将主要使用jQuery.form插件从jQuery调用,jQuery或此插件是否有处理错误响应的默认方式?
编辑:我决定使用jQuery + .ashx + HTTP状态码,如果成功,我将返回JSON,但在出错时,我将返回一个字符串,因为这似乎是jQuery.ajax的错误选项所期望的。
发布于 2009-03-23 16:20:34
您返回的HTTP状态代码应取决于发生的错误类型。如果数据库中不存在ID,则返回404;如果用户没有足够的权限进行Ajax调用,则返回403;如果数据库在能够找到记录之前超时,则返回500 (服务器错误)。
jQuery会自动检测这样的错误代码,并运行您在Ajax调用中定义的回调函数。文档:http://api.jquery.com/jQuery.ajax/
$.ajax
错误回调的简短示例:
$.ajax({
type: 'POST',
url: '/some/resource',
success: function(data, textStatus) {
// Handle success
},
error: function(xhr, textStatus, errorThrown) {
// Handle error
}
});
发布于 2009-03-23 16:39:22
有关您的情况的最佳实践的一些见解,请参阅this question。
主要的建议(来自上述链接)是标准化处理程序查找的响应结构(无论是成功还是失败),捕获服务器层的所有异常并将它们转换为相同的结构。例如(来自this answer):
{
success:false,
general_message:"You have reached your max number of Foos for the day",
errors: {
last_name:"This field is required",
mrn:"Either SSN or MRN must be entered",
zipcode:"996852 is not in Bernalillo county. Only Bernalillo residents are eligible"
}
}
这是stackoverflow使用的方法(如果你想知道别人是如何做这类事情的);像投票这样的写操作有"Success"
和"Message"
字段,无论投票是否被允许:
{ Success:true, NewScore:1, Message:"", LastVoteTypeId:3 }
作为@Phil.H pointed out,无论你选择什么,你都应该保持一致。这说起来容易做起来难(开发中的一切都是如此!)。
例如,如果您在SO上提交评论太快,而不是一致并返回
{ Success: false, Message: "Can only comment once every blah..." }
因此将抛出一个服务器异常(HTTP 500
),并在其error
回调中捕获它。
尽管使用jQuery + .ashx
+ HTTP状态码“感觉正确”,但它会增加客户端代码库的复杂性,而不是它的价值。要知道,jQuery并不“检测”错误代码,而是缺少成功代码。在尝试使用jQuery围绕http响应代码设计客户端时,这是一个重要的区别。您只有两个选择(是“成功”还是“错误”?),您必须自己进一步分支。如果你有少量的WebServices驱动少量的页面,那么这可能是可以的,但是更大的规模可能会变得混乱。
在HTTP中,返回一个自定义对象要比自定义WebService状态码自然得多。另外,您还可以免费获得JSON序列化。
发布于 2009-03-23 16:18:46
使用HTTP status code可能是一种RESTful方式,但这会建议您使用资源URI等使接口的其余部分成为RESTful。
实际上,您可以根据自己的喜好定义接口(例如,返回一个error对象,详细说明带有错误的属性,以及解释它的HTML块,等等),但是一旦您决定了在原型中工作的内容,就必须保持一致。
https://stackoverflow.com/questions/674027
复制相似问题