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

2024-01-11

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

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

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


See 这个问题 https://stackoverflow.com/questions/574035/how-to-handle-db-constraint-violations-in-the-user-interface了解适合您情况的最佳实践。

最重要的建议(来自所述链接)是标准化处理程序查找的响应结构(成功和失败),捕获服务器层的所有异常并将它们转换为相同的结构。例如(来自这个答案 https://stackoverflow.com/questions/574035/how-to-handle-db-constraint-violations-in-the-user-interface/575092#575092):

{
    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" and "Message"字段,无论是否允许投票:

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

As @Phil.H 指出 https://stackoverflow.com/questions/674027/what-should-a-json-service-return-on-failure-error#674046,无论你选择什么,你都应该保持一致。这说起来容易做起来难(开发中的一切都是如此!)。

例如,如果您太快地提交评论,而不是保持一致并返回

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

SO 将抛出服务器异常(HTTP 500)并在他们的error打回来。

使用 jQuery +“感觉不错”.ashx+ HTTP [状态代码] IMO 它会给您的客户端代码库增加比其价值更多的复杂性。意识到 jQuery 不会“检测”错误代码,而是检测是否缺少成功代码。当尝试使用 jQuery 围绕 http 响应代码设计客户端时,这是一个重要的区别。你只有两个选择(是“成功”还是“错误”?),你必须自己进一步分支。如果您有少量的 Web 服务驱动少量的页面,那么可能没问题,但规模较大的情况可能会变得混乱。

这是更自然的.asmxWebService(或 WCF)返回自定义对象而不是自定义 HTTP 状态代码。另外,您还可以免费获得 JSON 序列化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 服务在失败/错误时应返回什么 的相关文章

  • jQuery mCustomScrollbar 不适用于 ajax 内容

    window load function content 1 mCustomScrollbar scrollButtons enable true ajax code function beauty of ceylon content te
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • 使用 Ajax Jquery post 请求进行 Json 劫持

    昨天 我读了一些关于如何预防的好文章使用 Asp Net MVC 进行 Json 劫持 http haacked com archive 2009 06 24 json hijacking aspx 规则是 永远不要通过 get 请求发送
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • 如何组合多个jquery函数

    如果你查看下面的 jquery 代码 你会看到著名的 文档 ready 函数 这将启动脚本 我在网上几乎所有 jquery 代码示例中都看到了这一点 我想知道 如果我在一个文件中运行 5 个不同的代码函数 我是否需要使用 文档 ready
  • 有没有一种方法可以在没有输入的情况下发送表单值

    假设我有以下表格
  • Razor mvc3 + jquery + Url 操作 + 部分视图

    我有一个关于 jQuery Razor 的问题 我想使用 razor 和 Url Action 构建一个 javascript 变量 并且 html 属性将是输入的值 像这样 var d1 d1 val var d2 d2 val var
  • 试图隐藏选择列表中的选项..不适用于 chrome 和 ie

    我有一个选择列表 其中有很多选项 根据某些输入 我想从选择列表中隐藏一些选项 为了隐藏选择列表中的选项 我编写了jquery 例如 selectlist1 option each function this hide 但这段代码似乎只适用于
  • 将 json 反序列化为对象:包装类解决方法

    这是我的 json accessType Grant spaces spaceId 5c209ba0 e24d 450d 8f23 44a99e6ae415 privilegeId db7cd037 6503 4dbf 8566 2cca4
  • Twitter Typeahead 上使用 Bootstrap 3 的 CSS 问题

    随着 Bootstrap 3 的发布 Typeahead 已被删除 取而代之的是 https github com twitter typeahead js https github com twitter typeahead js 我已经
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • JQuery 菜单图标 RTL

    我正在尝试在阿拉伯语 RTL 页面中使用 jQuery 菜单 我可以将其设为 RTL 但图标应该是ui icon carat 1 w not ui icon carat 1 e 我创建jsfiddle在这里 http jsfiddle ne
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 后退按钮 (Chrome) 在 Play Framework 中获取 Json 而不是 HTML

    各位 我有一个 Web 应用程序 我在其中对同一资源的 JSON 和 HTML 表示重复使用了相同的路由 现在我们将其称为 foo details 该页面是从 bar details 链接的 因此 查看 bar details 您会看到链接
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • Google Apps 脚本中 $.ajax() 的服务器端等效项是什么?

    我想在 Google App 脚本中从服务器端代码执行 HTTP 请求Authorization标头 是否有用于发送 HTTP 请求的 App Script API Google Apps 脚本中的这段代码相当于什么 var api URL
  • 触发 jQuery UI 滑块事件

    如何触发更改事件jQuery UI 滑块 http docs jquery com UI Slider 我以为会是 slider trigger slidechange 但这没有任何作用 完整的示例脚本如下
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h
  • Cycle2 初始化事件未触发

    我使用 Cycle2 作为基本的轮播 我的幻灯片项目有时在其数据中包含一个 url 因此我必须使用 Cycle2 api 事件来使用该 url 当它存在时 我的问题是 虽然 cycle after 事件触发正常 但初始化事件都不会触发 因此

随机推荐

  • Google_Service_OAuth2 是 PHP 中的“未定义类型”

    我正在尝试使用 Google Sign in 登录 但它显示 Google Service OAuth2 为未定义类型 我找到了这个堆栈帖子 Google Service Oauth2 未定义 https stackoverflow com
  • Spark 中的分区和分桶有什么区别?

    我尝试优化两个 Spark 数据帧之间的联接查询 我们称它们为 df1 df2 在公共列 SaleId 上联接 df1非常小 5M 所以我在spark集群的节点之间广播它 df2 非常大 200M 行 所以我尝试通过 SaleId 对其进行
  • BERT 中 NER 的正确格式化数据应该是什么样子?

    我正在使用 Huggingface 的transformers库并希望使用 BERT 执行 NER 我试图找到一个明确的示例 说明如何使用 BERT 正确格式化 NER 的数据 从我发现的论文和评论中 我并不完全清楚 假设我们有以下句子和标
  • 修改C++函数中指针指向的位置

    我一直在修改指针的指针上陷入困境 问题是我不明白为什么我的代码有效 我想做的是修改函数中指针指向的位置 然后在我的主函数中访问该值 我尝试了很多次 这是我让它发挥作用的唯一方法 include
  • Hadoop Nodemanager 和 Resourcemanager 未启动

    我正在尝试在 Ubuntu 13 10 64 位上设置最新的 Hadoop 2 2 单节点集群 操作系统是全新安装的 我尝试过使用 java 6 64 位和 java 7 64 位 按照以下步骤操作后this http raseshmori
  • PHP - Strtotime - 添加时间

    我有这个变量 timestamp strftime Y m d h M S a time 我只是想增加三个小时并重复它 我已经看到了可以执行 60 60 3 方法或硬编码 3 小时 的方法 它可以理解这些单词 获得这个结果的最佳方法是什么
  • 在 ASP.NET Web API 控制器的 nunit 测试中实例化新的 System.Web.Http.OData.Query.ODataQueryOptions

    我有一个 ASP NET MVC4 Web API 项目 其中包含 ApiController 继承控制器 该控制器接受 ODataQueryOptions 参数作为其输入之一 我正在使用 NUnit 和 Moq 来测试该项目 这使我能够从
  • midi 文件解析,无法识别的事件类型

    我在尝试解析 MIDI 文件时遇到问题 我正在尝试解析 frets on fire 游戏使用的注释文件 它只使用 midi 文件 所以我认为这无关紧要 如果你们中的任何人熟悉它 我遇到的问题是一般的 midi 问题 我有一个文件 其中有一个
  • 我需要一个不会弄乱我打开的窗口的消息泵

    我的应用程序 我正在开发的安装程序的引导应用程序 需要启动一些其他应用程序 我的安装程序和满足安装程序先决条件的第三方安装程序 并等待它们完成 为了允许 GUI 进行屏幕更新在等待应用程序完成时 我使用有关空闲循环处理的 Visual St
  • Node.js 在 for 循环中调用回调函数

    我试图在 a 中调用一个函数for循环 问题是该函数在循环完成后被调用 以下面为例 它打印到控制台 here1 here1 here2 here2 代替 here1 here2 here1 here2 report forEach item
  • LINQ Lambda 连接错误 - 无法从使用情况推断

    我在加入两个 DbSet 时遇到问题 并继续收到 无法推断错误 我努力寻找解决方案 所以我想我会分享我的简单答案 乔恩 斯基特 Jon Skeet 和其他人发表了几篇很棒的帖子 但大多数答案都超出了我的理解范围 这是给我带来麻烦的代码 us
  • Rails 在新控制器中结合 RESTful 方法

    我有一个 Rails 应用程序 其中users create projects 目前 这些是嵌套的 并作为单独的操作完成 Auser寄存器 然后从project仪表板创建一个新的project 为了提高转化率 以及跟踪来自 adwords
  • PySpark - 将单个整数列表与列表列进行比较

    我正在尝试检查 Spark 数据帧 带有列表的列 中的哪些条目包含给定列表中最大数量的值 我想出的最好的方法是迭代数据框rdd foreach 并使用 python 比较给定列表与每个条目set1 intersection set2 我的问
  • ??空合并运算符 --> 合并是什么意思?

    我很想撒谎说英语是我的第二语言 但事实是我只是不知道 合并 是什么意思 我知道什么 在 C 中是 does 但这个名字对我来说没有意义 我查了一下这个词 我知道它是 加入 的同义词 空连接运算符 仍然没有意义 有人可以启发我吗 我很想撒谎说
  • 如何使用UIAppearance外观WhenContainedIn:

    我注意到在 iOS5 中我们可以通过以下方式自定义 UIKit 控件UIAppearance我开始使用它 我想用appearanceWhenContainedIn 定制UINavigationBar s tintColor在不同的班级 例如
  • 使用 puppeteer 和 MutationObserver 检测 DOM 更改

    我想检测某些加载页面上的 DOM 更改 例如 本地新闻页面上添加的新文章 并在检测后执行某些操作 发送电子邮件 在此示例中 我尝试检测子节点是否已从父节点 目标 div 节点 添加或删除 并在检测后在控制台中输出某些内容 我需要实现暴露功能
  • 在python中读取大csv文件的行

    我有一个非常大的 csv 文件 无法完全加载到内存中 所以我想一块一块地读取它 将其转换为numpy数组 然后再做一些处理 我已经检查过了 在Python中读取大文件的惰性方法 https stackoverflow com questio
  • 如何在谷歌应用程序引擎(Python)中使用numpy

    根据官方文档 numpy 作为谷歌应用程序引擎中的库支持here https developers google com appengine docs python tools libraries27 经过几次尝试后我无法导入它 有人可以分
  • 如何使用 Matplotlib 在对数刻度上显示次要刻度标签

    有谁知道如何使用 Python Matplotlib 以对数刻度显示次要刻度的标签 您可以使用plt tick params axis y which minor 设置小刻度并使用matplotlib ticker FormatStrFor
  • JSON 服务在失败/错误时应返回什么

    我正在用 C ashx 文件 编写 JSON 服务 成功请求服务后 我会返回一些 JSON 数据 如果请求失败 要么是因为抛出了异常 例如数据库超时 要么是因为请求在某种程度上是错误的 例如作为参数给出了数据库中不存在的 ID 服务应该如何