Java 使用Jersey REST维护事务流

Java 使用Jersey REST维护事务流,java,web-services,rest,jersey,Java,Web Services,Rest,Jersey,我对REST世界还很陌生,我们正在尝试将应用程序迁移到基于REST的体系结构。我们正在做一个概念证明,我们需要拿出一个工作证明,证明我们设定要实现的目标可以通过REST实现 在我们的体系结构中,前端屏幕将使用Angular并调用REST服务来打开客户会话,并在该会话中执行/维护事务,当会话完成时,将发送会话详细信息(即客户会话中的所有客户事务)以提交给DB。我们只想在客户完成一个会话中的所有事务后写入数据库。换句话说,只有在会话结束时才会提交到DB 我希望得到一些关于如何在Java类中最好地执行

我对REST世界还很陌生,我们正在尝试将应用程序迁移到基于REST的体系结构。我们正在做一个概念证明,我们需要拿出一个工作证明,证明我们设定要实现的目标可以通过REST实现

在我们的体系结构中,前端屏幕将使用Angular并调用REST服务来打开客户会话,并在该会话中执行/维护事务,当会话完成时,将发送会话详细信息(即客户会话中的所有客户事务)以提交给DB。我们只想在客户完成一个会话中的所有事务后写入数据库。换句话说,只有在会话结束时才会提交到DB

我希望得到一些关于如何在Java类中最好地执行以下步骤的指导

1) 浏览器启动打开新客户会话的请求。会话后期服务用于生成新会话ID。会话ID作为响应发送回浏览器

问题-->在我的Java类中维护此会话ID值的最佳方法是什么

2) 客户事务在会话中执行。对于处理的每个事务,使用事务POST服务将事务信息与会话信息一起保存

问题-->在我的Java类中,维护此事务信息的最佳方式是什么,以及如何将此事务信息与前一个会话POST信息创建的会话信息最佳关联?客户端将维护会话ID,但在服务端,我需要能够将事务与会话ID映射,以便我可以发回包含会话信息和该会话中的事务的组合会话有效负载

3) 客户可以执行更多的事务,执行的每个事务都是一个事务POST请求,必须与之前创建的会话id关联。执行的每个附加事务都必须与服务端的会话id相关联,这样,当我获取会话id时,我需要获取会话详细信息以及该会话中的所有事务

4) 最后,当会话完成时,来自会话的信息和服务端的会话负载(以及所有事务)将提交给DB

我只是在寻找一些关于如何最好地使用Java类和Jersey REST实现这一点的一般指导

任何指点都将不胜感激

谢谢
阿里。

基本上,这个问题不容易,需要大量的写作,不过我会尽力回答

首先,请记住REST是无状态的——这意味着没有会话,客户机需要对每个请求进行授权。这是一个单独的主题,但是REST中有一个很好的授权方法

其次,剩下的是名词,而不是动词。因此,您应该避免像
/session/{sessionId}/close/
这样的URL,但尝试使用名词和默认的HTTP操作对域进行建模:POST(创建)、PUT(更新)、GET(读取)、DELETE(删除)

我猜会话和事务只是一个抽象,我将向您展示如何在购物车的示例中建模。在所有的例子中,我都使用/users/{userId}/前缀加倍了URL-
,以显示您可以以多种不同的方式引用资源

  • 创建购物车(创建会话)

    请求:可能为空或应包含购物车的必要详细信息

    响应:必须包含新创建的shoppingCartID

    {
       "shoppingCartID": "1qaz2wsx"
       ... 
    }
    
  • 将项目添加到购物车(创建交易)

    请求:包含有关正在添加的项目的详细信息

    响应:返回新添加的项及其唯一ID

  • 支付购物车费用(提交交易)

    请求:必须包含
    shoppingCartID

    {
        "shoppingCartID": "1qaz2wsx"
        ...
    }
    
    响应:包含有关新创建付款的详细信息

    {
        "paymentId": "3edc4rfv"
        ...
    }
    
  • 我知道这是一个笼统的答案,但对于如此广泛的问题,很难给出准确的答案

    编辑(在评论中讨论后)

    在我看来,在批准交易之前,应使用DB将其保存在临时表中。即使您不想使用DB,但强烈建议使用任何其他持久性存储—想象一下,如果事务未经批准而重新启动服务器,会发生什么情况,您将丢失所有数据

    我看到的选择是:

    • 在记忆中。您可以编写一个具有同步访问的简单内存结构。在最简单的情况下,只需简单的旧
      HashMap
      就足够了。请注意,以这种方式保存数据是有风险的,数据很容易被删除
    • 使用文件系统。如果不想使用DB,可以使用文件系统在事务未提交时保留事务数据。添加新事务后,它将写入文件。提交时读取文件,并将所有事务保存到数据库。同步文件访问在这里也非常重要。在数据格式方面,您可以使用JSON、XML,甚至纯java序列化
    • 我想到的最后一个想法是使用内存中的DB,比如Redis。数据将在系统重新启动时被删除,因此它们不太可能被删除,但我认为这也不安全。这种数据库比传统数据库更易于使用/维护

    这完全取决于你想要实现什么。我无法想象这样一种场景:未提交的事务可以被简单地删除,而什么也不会发生——似乎必须进行持久存储。不过,上述想法也可能有用。

    感谢@Opal花时间。我对其他电话的理解已经确定。我所寻找的是关于构建最佳实践的指导
    POST /payments/
    POST /users/{userID}/payments/
    
    {
        "shoppingCartID": "1qaz2wsx"
        ...
    }
    
    {
        "paymentId": "3edc4rfv"
        ...
    }