ASP.NET Web API 中的多个 PUT 方法

2024-01-03

我有一个控制器Groups通过以下行动:

public GroupModel Get(int ID)

public GroupModel Post(CreateGroupModel model)

public void Put(PublicUpdateGroupModel model)

public void PutAddContacts(UpdateContactsModel model)

public void PutRemoveContacts(UpdateContactsModel model)

public void Delete(int ID)

我想做的是使用标准 REST 路由来调用标准 get、post、put、delete 方法。但请致电PutAddContacts and PutRemoveContacts如果操作名称附加到 url 后,例如:

GET groups/ - 调用 Get 方法

POST groups/ - 调用 Post 方法

PUT groups/ - 调用 Put 方法

DELETE groups/ - 调用删除方法

PUT groups/addcontacts - 调用 PutAddContacts 方法

PUT groups/removecontacts - 调用 PutRemoveContacts 方法

是否可以设置路由来执行此操作,或者如果我想在 URL 中使用操作名称,我是否需要沿着 RPC 路由进行路由?


你现在拥有什么
要使用上述方法,您需要使用 RPC。这是因为您的示例已经一半沉浸在 RPC 风格的处理中。默认 WebAPI 路由鼓励 RESTful 设置,但如果您对路由进行微小的更改,一切都会开始工作。例如,您可以将默认路由更改为典型的 MVC 路由:

routes.MapRoute( name    : "Default",       
                 url     : "{controller}/{action}/{id}",
                 defaults: new { controller = "Home", 
                                 action     = "Index", 
                                 id         = UrlParameter.Optional });

添加路由后,以典型的 MVC 方式调用,其中使用控制器名称和操作。然而,从你的问题来看,我怀疑你实际上想要 RESTful,而不是仅仅让它工作,所以请继续阅读......

保持安静
REST 不需要 HTTP http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven,尽管两者经常被放在一起讨论。 REST 实际上是关于每个资源都具有语义上准确的表示。当使用 HTTP 时,这意味着尊重 HTTP 语义的唯一 URI。例如,使用 HTTP GET 的调用永远不应该修改数据,因为这违反了 HTTP 的 GET 定义并混淆了 HTTP 基础设施(如缓存)。

POST/PUT 与 MERGE/PATCH
我们都熟悉 GET、POST、PUT、HEAD 等 HTTP 方法。一般来说,GET 用于检索,POST 用于添加,PUT 用于修改(尽管存在很多争论)。然而,您有两种类型的修改:添加项目和从集合中删除项目。那么这些都是 PUT 还是其他什么?社区还没有完全解决 http://www.dehora.net/journal/2009/02/03/just-use-post/关于如何做到这一点。

  • 选项 1:自定义媒体类型- HTTP 规范确实允许各种方法,但浏览器真正将我们限制在熟悉的子集上。所以你可以创建MERGE(Roy Fielding 的解决方法)或 PATCH(oData 的解决方法) https://stackoverflow.com/questions/2443324/best-practice-for-partial-updates-in-a-restful-service方法并定义这种新媒体类型的行为——可能一个用于添加,一个用于删除。

  • 选项 2:使用 POST/PUT- 使用 PUT 添加和删除联系人。只需将 ID 列表视为切换开关(如果存在则删除,如果缺少则添加),或者交替包含足够的信息以了解要做什么。然后返回 HTTP 303,向客户端表明其状态已过时并进行刷新。

  • 选项 3:完整列表- 如果您的集合大小合理,您每次想要更新时都可以传递完整的联系人列表。这种方式的逻辑是超级简单的擦除和替换。

从 RESTful 角度来看,真正重要的是您的应用程序在所有方法中都以一致的方式运行。因此,如果 MERGE 意味着添加,那么它应该始终意味着添加。如果您希望将一组完整的 ID 传递给 PUT,则始终传递一组完整的 ID。

控制器设计
如果是我,我会把你的控制器分成多个控制器。一个控制器处理组,另一个控制器处理联系人(作为一个组),第三个控制器处理组内的一个联系人。就像是 ...

//api/Group/
public List<GroupModel> Get()
public GroupModel Get(int ID)
public GroupModel Post(GroupModel model)  //add a group
public GroupModel Put(GroupModel model)   //update a group (see comments above)
public void Delete(int ID)


//api/GroupContacts/
public ContactsModel Get()                    //gets complete list
public void PostContacts(ContactsModel model) //pushes a COMPLETE new state
public void Delete()                          //delete entire group of contacts


//api/GroupContact/354/
public ContactModel Get(int id)             //get contact id #354
public void PostContact(ContactModel model) //add contact (overwrite if exits)
public void Delete(int id)                  //delete contact if exists

如果您希望您的 URL 显示为嵌套的(例如:/api/Group/Contacts, /api/Group/Contact),你可以看看我写的另一篇文章 https://stackoverflow.com/a/10471854/215068。恕我直言,asp.net 的路由需要调整以支持更容易的嵌套......但这是一个不同的问题;-)

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

ASP.NET Web API 中的多个 PUT 方法 的相关文章

随机推荐

  • 将蛋糕脚本中的警告消息记录在文本文件中

    我正在使用下面的蛋糕脚本来编译我的C 项目 中显示的警告消息很少PowerShell执行脚本时 我喜欢将警告记录在物理位置的文本文件中 例如 D WarningReport txt 下面是我用来编译项目的蛋糕脚本任务 Task Build
  • 使用JNI而不是JNA调用本机代码?

    与 JNI 相比 JNA 似乎更容易用来调用本机代码 在什么情况下您会使用 JNI 而不是 JNA JNA 不支持 C 类的映射 因此如果您使用 C 库 则需要 jni 包装器 如果你需要大量的内存复制 例如 您调用一个方法 该方法返回一个
  • 在 Pygame 上播放 midi

    好的 这就是我得到的 import pygame import sys from pygame locals import bif bg jpg mif pkmn png sif bubble png song 1 testaudio mi
  • base64 解码的文件不等于原始未编码的文件

    我有一个普通的pdf文件 A pdf 第三方以base64对该文件进行编码 并将其作为长字符串在网络服务中发送给我 我无法控制第三方 我的问题是 当我使用 java org apache commons codec binary Base6
  • 什么是好的、众所周知的 JavaScript MVC 模式?

    在 ASP NET MVC 应用程序中管理 JavaScript 文件和函数 对象上下文的最佳方法是什么 谷歌说http javascriptmvc com http javascriptmvc com
  • 在 Quartz 作业中使用 CDI

    我想知道是否可以在 Quartz 作业中以可移植的方式使用 CDI bean 我已经尝试编写自己的 JobFactory 等 但问题是 BeanManager 无法通过 JNDI 使用 因为作业在非托管线程中运行 我的应用程序服务器是 We
  • React组件的render函数中返回DOM元素

    我有一个外部库 可以呈现一些自定义 js 控件 该库返回一个可以插入到页面中的 DOM 元素 我正在 React 中为这个库创建包装器 我已经将所有内容都连接起来 但我不确定如何允许渲染函数接受 DOM 元素作为其返回 render if
  • 如何在 HtmlAgilityPack 中按类获取元素

    你好 我制作 HttpWebResponse 并获取包含我需要的所有数据的 Html 页面 例如带有日期信息的表 我需要将它们保存到数组列表并将其保存到 xml 文件 html 页面示例 table tr td class padding5
  • 如何在 元素内创建标签?

    我想在输入元素内插入描述性文本 当用户单击它时该描述性文本就会消失 我知道这是一个很常见的技巧 但我不知道该怎么做 最简单 更好的解决方案是什么 如果您使用的是 HTML5 则可以使用placeholder属性
  • 这是什么样的排序?

    假设我有一个整数列表 其中每个元素都是 1 到 20 之间的数字 这不是我要排序的内容 现在 我有一个 操作 数组 其中每个操作 Removes列表中的某些 已知 数字 and Adds列表中的某些其他 已知 号码 and如果列表在操作开始
  • 使用 Underscore JS 对 JSON 数组进行分组和聚合

    我有一个 json 数组对象 我想根据 FlexCategoryName 列对数据进行分组 并对矩阵列执行聚合 例如 成本 平均值 点击 总和等 下面是 JSON 数组对象 Array 100 0 Object 1 Object 2 Obj
  • 我将如何计算数组中每个字母数字的数量? (美国PL)

    我不知道如何获取矩阵并计算每行的字母数字值的数量 我只会采用具有我正在计算的值的矩阵 例如 如果我得到 ABA455 7L9O36G DZLFPEI 第一行我会得到类似 A 2 B 1 4 1 5 2 的内容 并且每一行都会独立计数 如果您
  • 带片段的 ViewPager - onPause()、onResume()?

    使用时ViewPager带着碎片 我们的onPause onResume在选项卡之间移动时不会调用方法 有没有什么方法可以让我们在片段中弄清楚我们何时变得可见或隐藏 不幸的是我有逻辑onResume onPause 就像注册位置服务一样 切
  • 在深度嵌套的字典中查找键

    我有很多嵌套字典 我试图找到嵌套在某处的某个键 例如这个钥匙叫做 水果 我如何找到这个键的值 H vard 的递归解决方案可能会没问题 除非嵌套级别太高 然后你会得到一个RuntimeError maximum recursion dept
  • 我可以使用一个控制器更新 AngularJS 中的两个视图吗?

    是否可以将两个视图绑定到一个控制器 以便无论数据在何处 视图1 视图2或模型中 发生更改 两个视图都会更新 它应该像这个例子一样工作 消除混乱
  • Python函数的参数长度? [复制]

    这个问题在这里已经有答案了 可能的重复 如何找出Python中方法的数量 https stackoverflow com questions 990016 how to find out the arity of a method in p
  • RabbitMQ:如何在标头交换中使用复杂表达式?

    下面是死信队列中消息的标头 我正在使用 RabbitMQ TypeId com example queue TesteDTO correlationId dfbc9457 8de6 9b77 b7ad b259d1e2ede4 sequen
  • Google SignInButton 的 onClick 无法使用数据绑定

    当我尝试设置onClick我的 Google 中的方法SignInButton android onClick gt viewModel onGoogleLoginClick 我总是收到这个错误 发现数据绑定错误 数据绑定错误 msg 找不
  • 如何从 NSDate 中找到一周的开始?

    我正在实现一个日历视图 我希望它从包含特定日期的一周开始开始 例如 如果目标日期是 2016 年 2 月 29 日星期一 并且当前日历设置为从星期日开始 我希望我的视图从 2 月 28 日星期日开始 这看起来应该很简单 let calend
  • ASP.NET Web API 中的多个 PUT 方法

    我有一个控制器Groups通过以下行动 public GroupModel Get int ID public GroupModel Post CreateGroupModel model public void Put PublicUpd