如果出现故障/错误,JSON服务应该返回什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

我正在用C#编写JSON服务(.ashx文件)。在对服务的成功请求中,我返回一些JSON数据。如果请求失败,或者是因为引发了异常(例如数据库超时)或者因为请求在某种方式上是错误的(例如数据库中不存在的ID作为参数),服务应该如何响应?什么HTTP状态代码是明智的,我应该返回任何数据,如果有的话?

我预计该服务将主要使用jQuery.form插件从jQuery中调用,jQuery或此插件是否具有处理错误响应的任何默认方式?

我决定我将使用jQuery + .ashx + HTTP [状态码]成功我会返回JSON,但在错误我会返回一个字符串,因为它似乎是jQuery的错误选项。

提问于
用户回答回答于

返回的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
  }
});
用户回答回答于

顶线建议(来自所述链接)是标准化你的处理程序寻找的响应结构(成功和失败),捕获服务器层的所有异常并将它们转换为相同的结构。例如:

{
    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"
    }
} 

写这样的投票操作具有"Success""Message"领域,不管是否表决允许或不允许:

{ Success:true, NewScore:1, Message:"", LastVoteTypeId:3 }

无论你选择什么,你都应该保持一致。这说起来容易做起来难(一切都在开发中!)。

例如,如果在SO上提交评论的速度太快,而不是一致并且返回

{ Success: false, Message: "Can only comment once every blah..." }

SO会抛出一个服务器异常(HTTP 500)并在error回调中捕获它。

尽管使用jQuery + .ashx+ HTTP [状态代码] IMO会感觉“正确”,但它会为您的客户端代码库增加更多复杂性,而不是值得。意识到jQuery不会“检测”错误代码,而是缺少成功代码。当试图围绕使用jQuery的http响应代码设计客户端时,这是一个重要的区别。你只有两种选择(是“成功”还是“错误”?),你必须自己进一步分支。如果你有少量WebServices驱动少量页面,那么它可能没关系,但是任何大规模的东西都可能会变得混乱。

.asmxWebService(或WCF)中返回自定义对象比自定义HTTP状态代码更自然。另外你可以免费获得JSON序列化。

扫码关注云+社区