wcf:rest_REST:管理多对多关系

wcf:rest

介绍

管理多个资源之间的关系可能是RESTful API的重要组成部分。 在这篇文章中,我们将看到使用REST API可以管理多对多关系。

我们以一个简单的用户 / 关系为例。 假设用户和组是两个单独的资源(例如/ users/ groups ),并且我们希望提供一种方法来管理以下几点所描述的关系:

  • 可以将一个用户添加到多个组
  • 一个组可以包含多个用户
  • 用户只能添加一次到组

多对多关系可以分为两种不同的类型:

  • 除实际关系外,没有其他信息的关系
  • 包含其他数据的关系。 在我们的例子中可以像一组成员状态(例如, 用户是在一个主持人和一个简单的成员在另一

在本文中,我们将只讨论第一种类型的关系。 与其他数据的关系将在以后的文章中介绍。

当然,没有单个正确的解决方案可以解决此问题。 下一节将介绍我获得最佳经验的方法。 之后,我们将介绍一些替代解决方案。

建模子资源和GET操作

首先,我们介绍两个子资源:

  • / users / <用户ID> / groups代表分配给ID为<用户ID>的用户的组
  • / groups / <group-id> / users代表分配给ID为<group-id>的组的用户

现在,使用GET动词可以请求两个集合。

将用户分配到特定组:

 GET /groups/<group-id>/users 

获取分配给特定用户的组:

 GET /users/<user-id>/groups 

添加和删​​除用户

现在,我们需要一种将用户添加到组的方法。 我们使用PUT动词执行此操作。

将用户添加到组:

 PUT /groups/<group-id>/users/<user-id> 

此操作不需要请求正文。

例如,这将用户32添加到组21中

 PUT /groups/ 21 /users/ 32 

请注意,在这里我们需要问一个问题:是否将用户添加到组是幂等的。 在我们的示例中,该操作是幂等的:用户只能添加一次到组中。 因此,我们使用PUT动词。 如果分配操作不是幂等的(例如,可以将一个用户多次添加到一个组中),我们必须使用POST而不是PUT。

在我的其他文章中,您可以阅读有关幂等性以及POST和PUT之间的区别的更多信息。

或者,我们也可以根据需要从/ users角度对该操作进行建模。

向用户添加组:

 PUT /users/<user-id>/groups/<group-id> 

要从组中删除用户,我们使用DELETE动词。

从组中删除用户:

 DELETE /groups/<group-id>/users/<user-id> 

例如,这将用户32从组21中删除:

 DELETE /groups/ 21 /users/ 32 

反之亦然,从/ users一侧开始:

从用户删除组:

 DELETE /users/<user-id>/groups/<group-id> 

请注意,尽管我们在/ groups / <group-id> / users / <user-id>上执行PUT和DELETE操作,但无需为此URI实现GET。 GET / groups / 21 / users / 32只会返回与GET / users / 32相同的结果(只要用户是给定组的一部分)

替代解决方案

引入单独的

另一种方法是创建一个完全独立的资源来管理用户之间的关系。

用户添加到可能如下所示:

 POST /group-members  { groupId: 31 , userId: 23  } 

为了将用户分配到给定的 ,我们可以使用与先前解决方案类似的请求:

 GET /groups/<group-id>/members 

但是,这一次它将返回一个组成员资源列表。

这种方法增加了一些复杂性(我们添加了一个可能具有其自身标识符的全新资源)。 但是,如果我们想向关系中添加一些其他信息(例如, 用户加入日期 ),则该功能特别有用。 在以后的文章中,我们将详细研究与其他数据之间的关系。

作为正常资源更新的一部分管理关系

另一种方法是使用标准更新操作来管理关系。 例如:

 PUT /users/ 23  { "name" : "John" , "groups" : [ { "id" : "42" }, { "id" : "43" } ]  } 

尽管这在某些情况下可以正常工作,但我不推荐这种方法。

资源和关系经常相互独立地进行更改。 将两个操作合并在一起可能会导致各种问题。 例如,从安全角度来看,两个操作可能需要不同的权限。 客户端可能被允许将用户添加到组中,但可能没有更新用户本身的权限。

由于存在很多关系,因此这种方法的性能也非常麻烦。 因此,通常最好提供单独的操作来更新资源和关系。

翻译自: https://www.javacodegeeks.com/2020/06/rest-managing-many-to-many-relations.html

wcf:rest

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java安全——类加载器+字节码校验+安全管理器与访问权限

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全 的相关知识&#xff1b; 【1】类加载器 1&#xff09;java 技术提供了以下3种确保安全的机制&#xff08;mechanism&#xff09;&#xff1a; m1&#xff09;语言设计特性&am…

Tomcat的web项目部署方式

一、host配置Context 在tomcat中的conf目录中&#xff0c;在server.xml中的&#xff0c;<host/>节点中添加&#xff1a; <Context path"/app" docBase"D:/myeclipse/firstapp/WebRoot" debug"0" privileged"true" reloadab…

java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法

1&#xff09;problem 出现 java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException 异常的原因是&#xff0c;在命令行执行 rmiregistry&#xff0c;并没有指定好 绑定时查找的类文件的路径。 …

javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!

javafx 图标动机 自2013年以来&#xff0c;我一直在编写JavaFX应用程序和库的代码&#xff0c;它们的共同点是&#xff0c;我需要找到可以用于它们的良好图标/图形。 作为前Swing开发人员&#xff0c;我首先使用图像文件&#xff0c;GIF或PNG。 通常&#xff0c;我会从IconExpe…

java安全 ——JAAS(Java 认证和授权服务)开发指南

以下内容转自&#xff1a; http://lyb520320.iteye.com/blog/720478【0】README1&#xff09;本文翻译自&#xff1a;http://java.sun.com/developer/technicalArticles/Security/jaasv2/2&#xff09;传统的JAVA安全机制没有提供必要的架构支持传统的认证和授权&#xff1b;在…

aws dynamodb_AWS Lambda将数据保存在DynamoDB中

aws dynamodb在本教程中&#xff0c;我们将看到如何使用AWS Lambda将数据保存在Dynamo DB中。 这是必需的步骤&#xff1a; – 在Dynamo数据库中创建一个名为Employee的表 –创建一个AWS Lambda函数&#xff0c;该函数可以使用Dynamo DB中的Employee POJO保存员工的名字和姓…

Tomcat处理一个HTTP请求的过程

一、Tomcat的组成 &#xff08;1&#xff09;Server服务器元素代表整个catalina servlet容器。是单例模式。 &#xff08;2&#xff09;ServiceService是这样一个集合&#xff1a;它由一个或者多个Connector组成&#xff0c;以及一个Engine&#xff0c;负责处理所有Connector所…

java安全——数字签名+代码签名

【0】README1&#xff09;本文文字描述转自 core java volume 2, 旨在学习 java安全——数字签名 的基础知识&#xff1b;2&#xff09;本文实践内容以及截图笔记均为原创&#xff1b;3&#xff09;如果要给予applet更多的信赖&#xff0c;你必须知道下面两件事&#xff1a; 3.…

//rest风格写_REST /使用提要发布事件

//rest风格写处理事件 当使用多个解耦的服务时&#xff08;例如&#xff0c;在微服务体系结构中 &#xff09;&#xff0c;很有可能需要一种方法来将某种域事件从一个服务发布到一个或多个其他服务。 许多广泛采用的解决方案依赖于单独的基础结构来解决此问题&#xff08;例如…

Java IO总结

一、IO的类型 面向字节的流&#xff0c;面向字符的流二、面向字节的流 &#xff08;1&#xff09;InputStream FileInputStream FilterInputStream -BufferedInputStream -DataInputStream -PushbackInputStream 回退流 unread() ObjectInputStream PipedInputSt…

java安全——加密

【0】README1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全——加密 的基础知识&#xff1b;2&#xff09;java 安全性的第二个重要方面是加密。3&#xff09;认证对于代码签名已足够了-没必要将代码隐藏起来。但是&#xff0c;当applet或者应…

java 异常 最佳实践_处理Java异常的10种最佳实践

java 异常 最佳实践在本文中&#xff0c;我们将看到处理Java异常的最佳实践。 用Java处理异常不是一件容易的事&#xff0c;因为新手很难理解&#xff0c;甚至专业的开发人员也可能浪费时间讨论应该抛出或处理哪些Java异常。 因此&#xff0c;最大的开发公司对如何使用它们有一…

Java NIO总结

一、NIO NIO是new IO&#xff0c;也是非阻塞IO。有Channel、Selector、Buffer、Pipe、FileLock等类。 Buffer在java.nio包 Channel、Selector、Pipe、FileLock等在java.nio.channels包 二、Channel通道 设置非阻塞configureBlocking(false); 注册选择器register(selector,…

java 不可变map_如何用Java创建不可变的Map

java 不可变map你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何在Java中创建不可变的Map。 –不可变的类或对象是什么意思&#xff1f; –什么是不可变地图&#xff1f; –如何在Java中创建不可变的Map&#xff1f; 不变的类或对象是什么意思&#xff1f; 不可…

ToolProvider.getSystemJavaCompiler() return null 的解决方法

【1】利用java 编译器API 编译 普通的java文件 1.1&#xff09;代码如下&#xff1a; package com.corejava.chapter10_2;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream;import javax.tools.JavaCompiler; import jav…

脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报

脚本错误和安全警报怎么解决监视对于任何实际应用都是关键的。 您必须知道正在发生的事情&#xff0c;并在发生问题时实时得到警报。 AWS为此提供了CloudWatch&#xff0c;并自动为您提供了许多指标。 但是&#xff0c;您必须定义一些自己的东西。 然后&#xff0c;您需要定义适…

java平台脚本+java编译器API

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java平台脚本java编译器API 的 基础知识&#xff1b; ------------------------------------------------------------------------------ 【1】java平台的脚本 1&#xff09;脚本语…

Java 多线程总结

一、多线程实现方式 &#xff08;1&#xff09;继承Thread类&#xff0c;覆盖run方法 &#xff08;2&#xff09;实现Runnable接口&#xff0c;覆盖run方法&#xff0c;将对象传人Thread对象中实现Runnable接口比继承Thread类所具有的优势&#xff1a; 1&#xff09;适合多个相…

古巴比伦乘法_古巴:为生产做准备

古巴比伦乘法“它可以在我的本地机器上运行&#xff01;” 如今&#xff0c;它听起来像模因&#xff0c;但是“开发环境与生产环境”的问题仍然存在。 作为开发人员&#xff0c;您应始终牢记&#xff0c;您的应用程序有一天将在生产环境中开始运行。 在本文中&#xff0c;我们将…

java编译器API——使用编译工具

【0】README 0.1&#xff09;以下内容转自&#xff1a; http://suntips.iteye.com/blog/69002 0.2&#xff09;for basic java compiler API, please visit http://blog.csdn.net/pacosonswjtu/article/details/50718494 1&#xff09;当你需要更好的处理这些结果时,你可以使…