当前位置:  开发笔记 > 编程语言 > 正文

JSON服务应该在失败/错误时返回什么

如何解决《JSON服务应该在失败/错误时返回什么》经验,为你挑选了3个好方法。

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

我期待主要使用jQuery.form插件从jQuery调用服务,jQuery或者这个插件有没有处理错误响应的默认方式?

编辑:我已经决定我将成功使用jQuery + .ashx + HTTP [状态代码]我将返回JSON但是在出错时我会返回一个字符串,因为看起来这就是jQuery的错误选项.阿贾克斯预计.



1> Crescent Fre..:

请参阅此问题,以了解有关您的具体情况的最佳做法.

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驱动少量页面,那么它可能没问题,但任何规模较大的可能都会变得混乱.

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



2> Ron DeVera..:

您返回的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
  }
});


作为一个用户,如果我收到500我知道我不应该责备,如果我收到400我可以解决我做错了,这在编写API时尤其重要,因为你的用户具有技术素养和400告诉他们正确使用API​​.PS - 我同意数据库超时应为500.
500范围是服务器错误,但服务器上没有出错.他们提出了一个不好的要求,所以它不应该在400范围内吗?
只是想指出404意味着*丢失了被寻址的资源*.在这种情况下,资源是您的POST处理器,而不是数据库中具有id的随机事物.在这种情况下,400更合适.
如果有人提供无效数据,您认为我应该返回什么错误代码,例如需要整数的字符串?或无效的电子邮件地址?

3> Phil H..:

使用HTTP状态代码将是一种RESTful方式,但这建议您使用资源URI等来创建RESTful接口的其余部分.

实际上,根据需要定义接口(返回一个错误对象,例如,详细说明带有错误的属性,以及解释它的一大块HTML等),但是一旦你决定在原型中工作的东西,无情地保持一致.


哦,并且+1表示何时使用以及何时不使用RESTful响应.:-)
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有