首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JSON服务在出现故障/错误时应该返回什么

JSON服务在出现故障/错误时应该返回什么
EN

Stack Overflow用户
提问于 2009-03-23 16:15:49
回答 11查看 104.1K关注 0票数 79

我正在用C# (.ashx文件)编写一个JSON服务。在对服务的成功请求中,我返回一些JSON数据。如果请求失败,无论是因为抛出了异常(例如,数据库超时),还是因为请求在某种程度上是错误的(例如,给出了一个不存在于数据库中的ID作为参数),服务应该如何响应?哪些HTTP状态代码是合理的,我应该返回任何数据吗?

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

编辑:我决定使用jQuery + .ashx + HTTP状态码,如果成功,我将返回JSON,但在出错时,我将返回一个字符串,因为这似乎是jQuery.ajax的错误选项所期望的。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-03-23 16:20:34

您返回的HTTP状态代码应取决于发生的错误类型。如果数据库中不存在ID,则返回404;如果用户没有足够的权限进行Ajax调用,则返回403;如果数据库在能够找到记录之前超时,则返回500 (服务器错误)。

jQuery会自动检测这样的错误代码,并运行您在Ajax调用中定义的回调函数。文档:http://api.jquery.com/jQuery.ajax/

$.ajax错误回调的简短示例:

代码语言:javascript
复制
$.ajax({
  type: 'POST',
  url: '/some/resource',
  success: function(data, textStatus) {
    // Handle success
  },
  error: function(xhr, textStatus, errorThrown) {
    // Handle error
  }
});
票数 34
EN

Stack Overflow用户

发布于 2009-03-23 16:39:22

有关您的情况的最佳实践的一些见解,请参阅this question

主要的建议(来自上述链接)是标准化处理程序查找的响应结构(无论是成功还是失败),捕获服务器层的所有异常并将它们转换为相同的结构。例如(来自this answer):

代码语言:javascript
复制
{
    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"字段,无论投票是否被允许:

代码语言:javascript
复制
{ Success:true, NewScore:1, Message:"", LastVoteTypeId:3 }

作为@Phil.H pointed out,无论你选择什么,你都应该保持一致。这说起来容易做起来难(开发中的一切都是如此!)。

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

代码语言:javascript
复制
{ Success: false, Message: "Can only comment once every blah..." }

因此将抛出一个服务器异常(HTTP 500),并在其error回调中捕获它。

尽管使用jQuery + .ashx + HTTP状态码“感觉正确”,但它会增加客户端代码库的复杂性,而不是它的价值。要知道,jQuery并不“检测”错误代码,而是缺少成功代码。在尝试使用jQuery围绕http响应代码设计客户端时,这是一个重要的区别。您只有两个选择(是“成功”还是“错误”?),您必须自己进一步分支。如果你有少量的WebServices驱动少量的页面,那么这可能是可以的,但是更大的规模可能会变得混乱。

在HTTP中,返回一个自定义对象要比自定义WebService状态码自然得多。另外,您还可以免费获得JSON序列化。

票数 56
EN

Stack Overflow用户

发布于 2009-03-23 16:18:46

使用HTTP status code可能是一种RESTful方式,但这会建议您使用资源URI等使接口的其余部分成为RESTful。

实际上,您可以根据自己的喜好定义接口(例如,返回一个error对象,详细说明带有错误的属性,以及解释它的HTML块,等等),但是一旦您决定了在原型中工作的内容,就必须保持一致。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/674027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档