gpt4 book ai didi

java - Rails 应用程序,但所有数据层都使用基于 json/xml 的 Web 服务

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:59 25 4
gpt4 key购买 nike

我有一个用 Java/Jersey 编写的 Web 服务层,它提供 JSON。

对于应用程序的前端,我想使用 Rails。

我应该如何构建模型?

我应该这样做吗?

response = api_client.get_user(123)

User user = User.new(response)

将 JSON 映射到 Ruby 对象的最佳方法是什么?

我有哪些选择?由于这是一个关键部分,我想知道我的选择,因为性能是一个因素。这与将 JSON 映射到 Ruby 对象并从 Ruby 对象 => JSON 一起在应用程序中很常见。

我还能使用验证吗?或者它没有意义,因为我会在前端和服务层重复验证?

最佳答案

Rails 中的模型不需要进行数据库操作,它们只是普通的类。通常,当您从 ActiveRecord::Base 继承它们时,它们会充满 ActiveRecord 魔力。

您可以使用诸如 Virtus 之类的 gem这将为您提供具有属性的模型。对于验证,您可以使用 Vanguard .如果你想要接近 ActiveRecord 但没有数据库并且正在运行 Rails 3+ 的东西,你还可以将 ActiveModel 包含到你的模型中以获取属性和验证以及让它们工作在表格中。参见 Yehuda Katz's post有关详细信息。

在您的情况下,这将取决于您将使用的数据。例如,如果所有数据源都具有相同的基本格式,您可以创建自己的基类来保留您希望在各个类之间共享的所有逻辑(继承)。

如果您有几种不同类型的数据,您可以创建模块来封装不同类型的行为,并将您需要的模型包含在适当的类(组合)中。

通常,尽管您可能希望远程 API 中的每个资源都有一个类,它与您拥有的任何域逻辑 1 对 1 映射。您可以通过许多不同的方式来做到这一点,但是遵循 ActiveRecord 使用的方法命名可能是一个好主意,因为您在构建类结构时学习了 ActiveRecord,并且如果您的 API 看起来和工作方式类似于 ActiveRecords,它将在以后帮助其他 Rails 开发人员。

根据您希望能够对对象执行的操作来考虑它(这就是 TDD 的用武之地)。您希望能够获取集合 Model.all、特定元素 Model.find(identifier),将更改的元素推送到远程服务 updated_model。保存等。

这些方法内部的实际逻辑将取决于远程服务。但是您可能希望每个模型类都保存一个指向其资源端点的 url,并且您会非常希望将逻辑保留在您的模型中。所以不是:

response = api_client.get_user(123)

User user = User.new(response)

你会做

class User
...
def find id
@api_client.get_user(id)
end
...
end

User.find(123)

或者更有可能

class ApiClient
...
protected

def self.uri resource_uri
@uri = resource_uri
end

def get id
# basically whatever code you envisioned for api_client.get_user
end
...
end

class User < ApiClient
uri 'http://path.to.remote/resource.json'
...
def find id
get(id)
end
...
end

User.find(123)

基本原则:将所有的共享逻辑收集在一个类(ApiClient)中。基于每个资源(用户)的子类。将所有逻辑保留在模型中,系统的其他部分不必知道它是数据库支持的应用程序还是使用外部 REST API。最重要的是,如果您可以将集成逻辑完全保留在基类中。这样一来,如果外部数据源发生变化,您只有一个地方可以更新。

至于走另一条路,Rails 有几个很好的方法可以将对象转换为 JSON。从 to_json 方法到使用 RABL 等 gem 来获得 JSON 对象的实际 View 。

您可以使用部分 ActiveRecord 模块进行验证。从 Rails 4 开始,这是一个名为 ActiveModel 的模块,但您可以在 Rails 3 中完成它,并且有几个在线教程,尤其是 RailsCast。 .

性能不会成为问题,除非您在调用远程服务时遇到问题,如果网络速度很慢,您就会遇到问题。其中一些可能有助于缓存(有关详细信息,请参阅 another answer by me),但这也取决于您使用的数据。

希望这能让您走上正轨。如果您想更深入地了解如何设计此类结构,您应该阅读有关该主题的书籍,例如 Practical Object-Oriented Design in Ruby: An Agile Primer桑迪·梅斯 (Sandi Metz)。

关于java - Rails 应用程序,但所有数据层都使用基于 json/xml 的 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com