您能否帮助阐明有关RESTful服务和代码生成的一些观点?

时间:2011-03-02 22:57:56

标签: web-services rest code-generation

我一直在努力理解我一直在阅读有关RESTful服务的几点。我希望有人能帮助澄清。

1a)在讨论RESTful服务时似乎普遍厌恶生成的代码。

1b)如果你使用WADL为RESTful服务生成客户端,当服务发生变化时,你的客户代码也会发生变化。

为什么我没有得到它:无论您是引用WADL还是使用生成的代码,或者您是否已从RESTful响应中手动提取数据并将其映射到您的UI(或者您正在使用它们执行的任何操作)在底层服务中,似乎两种情况下代码都可能会中断。例如,如果返回的数据从FirstName和LastName更改为FullName,则在两个实例中都必须更新代码以获取新字段,并且可能以不同方式处理它。

2)RESTful服务不需要WADL的论点,因为返回类型应该是众所周知的MIME类型,并且您应该已经知道如何处理它们。

为什么我没有得到它:是否期望对于服务返回的每个“类型”数据,将存在唯一的MIME类型?如果是这种情况,这是否意味着RESTful服务的使用者应该阅读RFC以确定返回数据的结构,如何使用每个字段等?

我已经做了很多阅读,试图为自己解决这个问题,所以我希望有人可以提供具体的例子和现实场景。

2 个答案:

答案 0 :(得分:4)

REST可能非常微妙。我也做了大量的阅读,每隔一段时间我就回去阅读Chapter 5 of Fielding's dissertation,每次都能找到更多的洞察力。它第一次就像泥一样清晰(尽管有些事情是有意义的)但是只有在我尝试应用原理并使用构建块时才会变得更好。

所以,根据我目前的理解,让我们试一试:

为什么RESTafarians不喜欢代码生成?

答案简短:如果你使用超媒体(+链接)没有必要

上下文:在客户端和服务器之间明确定义合同(WADL)不会减少耦合 :如果更改服务器,则客户端会中断,您需要重新生成代码。 (恕我直言,甚至自动化它只是对潜在耦合问题的补丁)。

REST可帮助您在不同级别上解耦。 超媒体可发现性是开始使用的商品之一。另见相关概念HATEOAS

我们让客户“发现”我们正在运营的资源可以做什么,而不是之前定义合同。我们加载资源,检查“命名链接”,然后按照这些链接或填写表单(或表单链接)来更新资源。服务器通过基于状态建议的选项充当客户端的指南。 (想想业务流程/工作流程/行为)。如果我们使用合同,我们需要知道这个“带外”信息并更新合同。

如果我们使用带有链接的超媒体,就不需要“单独的合同”。一切都包含在超媒体中 - 为什么要设计一个单独的文档?甚至URI模板都是带外信息,但如果保持简单就可以像Amazon S3一样工作。

是的,我们在传输表示(超媒体)时仍需要一个共同点,因此我们定义您自己的媒体类型或使用广泛接受的媒体类型,如Atom或Micro-formats。因此,在基本构建块(链接+表单+数据 - 超媒体)的约束下,我们通过将带外信息保持在最低限度来减少耦合。

首先,看起来超媒体并没有改变变化的影响:):但是,存在微妙的差异。首先,如果我有一个WADL,我需要更新另一个文档并部署/分发。使用纯超媒体,因为它是嵌入式的,所以没有任何影响。 (想象一下,通过一系列复杂的系统交织,会发生变化)。根据您的示例,具有FirstName + LastName并且添加FullName并不会真正影响客户端,但删除First + Last并替换为FullName即使在超媒体中也是如此。

作为旁注:REST统一接口(动词约束 - GET,PUT,POST,DELETE +其他动词)将实现与服务分离。

也许我完全错了,但另一种可能性可能是代码生成的“心理反击”:WADL让人想到“传统的Web服务(WSDL + SOAP)”/ RPC中的WSDL(契约)部分反对REST。在REST状态下,通过超媒体传输,而不是RPC,这是在服务器上更新状态的方法调用。

免责声明:我没有详细完成参考文章,但我确实给出了一些很好的观点。

答案 1 :(得分:0)

我已经在API项目上工作了很长一段时间。 回答你的第一个问题。

是,如果服务返回值更改(例如:名字和姓氏变为全名),您的代码可能会中断。您将不再获得名字和姓氏。

您必须了解WADL是协议。如果必须更改,则需要通知客户端。为了避免破坏客户端代码,我们发布了新版本的API。

版本1.0将具有名字和姓氏,而不会破坏您的代码。我们将发布1.1版本,将更改为全名。

简而言之,WADL就是留下来的。只要您使用该版本的API。你的代码不会破坏。如果要获取全名,则必须转到新版本。在技​​术市场中有很多代码生成插件,生成代码应该不是问题。

回答你的下一个问题,为什么不是WADL,以及你如何了解mime类型。

WADL用于代码生成并用作合同。有了它,您可以使用JAXB或任何映射框架将JSON字符串转换为生成的bean对象。

如果不是WADL,则无需检查每个元素以确定类型。你可以很容易地做到这一点。

  

var obj =   jQuery.parseJSON( '{ “名”: “约翰”}');   alert(obj.name ===“John”);

如果您有任何问题,请告诉我。