- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个用 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/
正如标题中所问,我有两个如下结构的 XML 文件 A.xml //here I want to include B.xml
我有一个 xml 文件。根据我的要求,我需要更新空标签,例如我需要更改 to .是否可以像那样更改标签.. 谢谢... 最佳答案 var xmlString=" "; var properStri
我有这样简单的 XML: Song Playing 09:41:18 Frederic Delius Violin Son
在我的工作中,我们有自己的 XML 类来构建 DOM,但我不确定应该如何处理连续的空格? 例如 Hello World 当它被读入 DOM 时,文本节点应该包含 Hello 和 World
我有以下 2 个 xml 文件,我必须通过比较 wd:Task_Name_ID 和 TaskID 的 XML 文件 2。 例如,Main XML File-1 wd:Task_Name_ID 具有以下
我在 Rails 应用程序中有一个 XML View ,需要从另一个文件插入 XML 以进行测试。 我想说“构建器,只需盲目地填充这个字符串,因为它已经是 xml”,但我在文档中看不到这样做的任何内容
我正在重建一些 XML 提要,因此我正在研究何时使用元素以及何时使用带有 XML 的属性。 一些网站说“数据在元素中,元数据在属性中。” 那么,两者有什么区别呢? 让我们以 W3Schools 为例:
在同一个文档中有两个 XML 声明是否是格式正确的 XML? hello 我相信不是,但是我找不到支持我的消息来源。 来自 Extensible Markup Language
我需要在包装器 XML 文档中嵌入任意(语法上有效的)XML 文档。嵌入式文档被视为纯文本,在解析包装文档时不需要可解析。 我知道“CDATA trick”,但如果内部 XML 文档本身包含 CDAT
XML 解析器和 XML 处理器是两个不同的东西吗?他们是两个不同的工作吗? 最佳答案 XML 解析器和 XML 处理器是一样的。它不适用于其他语言。 XML 是通用数据标记语言。解析 XML 文件已
我使用这个 perl 代码从一个文件中读取 XML,然后写入另一个文件(我的完整脚本有添加属性的代码): #!usr/bin/perl -w use strict; use XML::DOM; use
我正在编写一个我了解有限的历史脚本。 对象 A 的类型为 system.xml.xmlelement,我需要将其转换为类型 system.xml.xmldocument 以与对象 B 进行比较(类型
我有以下两个 XML 文件: 文件1 101 102 103 501 502 503
我有以下两个 XML 文件: 文件1 101 102 103 501 502 503
我有一个案例,其中一个 xml 作为输入,另一个 xml 作为输出:我可以选择使用 XSL 和通过 JAXB 进行 Unmarshalling 编码。性能方面,有什么真正的区别吗? 最佳答案 首先,程
我有包含 XML 的 XML,我想使用 JAXB 解析它 qwqweqwezxcasdasd eee 解析器 public static NotificationRequest parse(Strin
xml: mario de2f15d014d40b93578d255e6221fd60 Mario F 23 maria maria
尝试更新 xml 文件数组时出现以下错误。 代码片段: File dir = new File("c:\\XML"); File[] files = dir.listFiles(new Filenam
我怎样才能完成这样的事情: PS /home/nicholas/powershell> PS /home/nicholas/powershell> $date=(Get-Date | ConvertT
我在从 xml 文件中删除节点时遇到一些困难。我发现很多其他人通过各种方式在 powershell 中执行此操作的示例,下面的代码似乎与我见过的许多其他示例相同,但我没有得到所需的行为。 我的目标是将
我是一名优秀的程序员,十分优秀!