【问题标题】:Use response from a restful webservice endpoint call to be used later on in some other webservice endPoint call使用来自 RESTful Web 服务端点调用的响应,以便稍后在其他 Web 服务端点调用中使用
【发布时间】:2018-04-25 05:44:41
【问题描述】:

我希望一个 web 服务调用的响应稍后被其他 web 服务调用使用。我如何实现它的代码流。我必须保持会话吗? 我正在使用 Spring、java 创建宁静的 Web 服务 如果用户 1 调用 endPoint /getUserRecord 并且 1 分钟后调用 /checkUserRecord 使用第一次调用的数据,如何处理它,因为用户 2 可以在用户 1 调用 /checkUserRecord 之前调用 /getUserRecord 我正在使用 Spring java 创建 RESTFul Web 服务。

谢谢, 阿皮特

【问题讨论】:

  • 不要让它有状态。将您从第一次调用中获得的 id 传递给另一个。
  • 但这需要再次调用数据库。我的想法是在第一次调用中检索 userRecord 并在第二次调用中使用它而不再次调用 Databse ..对此有什么建议吗?
  • 在第二次调用中,我相信您需要将整个 userRecord 传递给 /checkUserRecord。无需从数据库中检索。
  • 那么如何在第二个 webServiceCall 中不进行数据库调用的情况下检索 userRecord 呢?
  • 您缓存它,或者为良好的无状态设计做出权衡,然后再次询问数据库。如果用户已经拥有数据,他为什么要请求相同的数据?也许你的 api 设计不是最好的。您知道您是否有诸如 get 或 check in your endpoints 之类的动词有问题

标签: java spring rest web-services


【解决方案1】:

从技术上讲,您可以将 UserRecord 从 get 传递到 check。

GET /userrecords/ --> 返回一条或多条记录

POST /checkUserRecord 将您要检查的记录作为请求正文。

但我强烈建议您不要这样做。客户端提供的数据不可靠,您的后端代码无法信任。如果某些 javascript 更改了原始数据怎么办?此外,如果您有一个数据列表或异构有效负载来回传递怎么办,最终会导致客户端和服务器之间的有效负载交换完全混乱。

正如 Veselin Davidov 所说,您可能应该坚持使用干净的无状态 REST 范式并依赖标识符:

所以

GET /userrecords/ --> [ { "id": 1, "data":"myrecorddata"}, ...]

GET /checkUserRecord/{id} like /checkUserRecord/1

是的,您必须对数据库进行两次调用。如果您关心的是性能,您可以像 piy26 指出的那样设置一些缓存机制,但缓存可能会导致您遇到其他问题(如何定义适当且可靠的缓存策略?)。

除非您管理大量数据,否则我认为您应该首先专注于提供清晰、可维护且安全可用的无状态设计 REST API。

【讨论】:

    【解决方案2】:

    如果您使用的是 Spring Boot,它提供了一种在 Repository 对象上启用缓存的方法,这是您要解决的问题。

    @EnableCaching
    org.springframework.cache.annotation.EnableCaching
    

    您可以在创建密钥时使用 UserID 作为哈希属性,以便来自不同用户的响应保持唯一。

    【讨论】:

      猜你喜欢
      • 2015-11-16
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多