我正在用C#(.ashx文件)编写JSON服务.在成功请求服务后,我返回一些JSON数据.如果请求失败,要么是因为抛出异常(例如数据库超时),要么是因为请求在某种程度上是错误的(例如,数据库中不存在的ID作为参数),服务应该如何响应?什么HTTP状态代码是明智的,我应该返回任何数据,如果有的话?
我期待主要使用jQuery.form插件从jQuery调用服务,jQuery或者这个插件有没有处理错误响应的默认方式?
编辑:我已经决定我将成功使用jQuery + .ashx + HTTP [状态代码]我将返回JSON但是在出错时我会返回一个字符串,因为看起来这就是jQuery的错误选项.阿贾克斯预计.
请参阅此问题,以了解有关您的具体情况的最佳做法.
topline建议(来自所述链接)是标准化处理程序查找的响应结构(成功和失败),捕获服务器层的所有异常并将它们转换为相同的结构.例如(来自这个答案):
{ 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指出的那样,无论你选择什么,你都应该保持一致.这说起来容易做起来就像开发中的一切一样!
例如,如果您在SO上过快地提交评论,而不是保持一致并返回
{ Success: false, Message: "Can only comment once every blah..." }
SO将抛出服务器异常(HTTP 500
)并在其error
回调中捕获它.
尽管使用jQuery + .ashx
+ HTTP [状态代码] IMO "感觉正确",但它会增加客户端代码库的复杂性,而不是它的价值.意识到jQuery不会"检测"错误代码,而是缺少成功代码.当尝试使用jQuery围绕http响应代码设计客户端时,这是一个重要的区别.你只有两个选择(是"成功"还是"错误"?),你必须自己进一步分支.如果您有少量WebServices驱动少量页面,那么它可能没问题,但任何规模较大的可能都会变得混乱.
在.asmx
WebService(或WCF)中返回自定义对象比自定义HTTP状态代码要自然得多.另外,您可以免费获得JSON序列化.
您返回的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 } });
使用HTTP状态代码将是一种RESTful方式,但这建议您使用资源URI等来创建RESTful接口的其余部分.
实际上,根据需要定义接口(返回一个错误对象,例如,详细说明带有错误的属性,以及解释它的一大块HTML等),但是一旦你决定在原型中工作的东西,无情地保持一致.