什么是自上而下的Web服务和自下而上的Web服务之间的区别?

49
在Java中,顶层Web服务和底层Web服务有什么区别?此外,SOAP和RESTful Web服务之间有什么区别?

2
先合同后代码 VS 先代码后合同。 - Abimaran Kugathasan
6个回答

69

自上而下(Top-down)意味着您从WSDL开始,然后一路创建所有必要的Java支架。

自下而上(Bottom-up)意味着您从Java方法开始,并从中生成WSDL。

SOAP表示所有调用的URL相同,只有传递给Java方法的参数不同。REST表示URL加上在其上调用的HTTP方法反映了要执行的操作。


2
对于SOAP vs REST,我认为你的回答考虑到了OP在提问之前所做的研究工作,这是公正的。但是,以下是一些可能会更深入挖掘的文章: http://en.wikipedia.org/wiki/Representational_State_Transfer 和 http://en.wikipedia.org/wiki/SOAP - Anthony Accioly
1
@AnthonyAccioly,你的评论不是更适合作为你自己答案的一部分吗? - Thorbjørn Ravn Andersen
1
@ThorbjørnRavnAndersen:有一点需要纠正:在REST中,URL并不反映要执行的“操作”!它是HTTP方法(即GET、POST等)反映了要在URL标识的资源上执行的“操作”。 - Akshay Lokur

12
先合同后合同 自下而上:这种方法从问题的高层定义开始,将其细分为子问题,即后合同
  • 优点:

    • 先编码
    • 初始阶段非常容易开发。
  • 缺点:

    • 维护非常困难。
    • 耦合度高

自上而下:首先考虑基本功能和所需的部分,即先合同后开发

以下是偏好自上而下开发风格的原因:

1. 脆弱性 合同后开发风格会导致您的Web服务合同(WSDL和XSD)从Java合同(通常是接口)生成。如果您采用这种方法,您无法保证合同随时间保持不变。每次更改Java代码并重新部署时,Web服务合同可能会发生变化。 此外,并非所有的SOAP堆栈都能从Java合同生成相同的Web服务合同。这意味着更改当前的SOAP堆栈为其他堆栈(出于任何原因)可能会改变您的Web服务合同。 当Web服务合同发生变化时,合同的使用者必须被告知获取新的合同,并可能需要更改他们的代码以适应合同的任何变化。 为了使合同有用,它必须尽可能长时间保持不变。如果合同发生变化,您将不得不联系所有服务的用户,并指示他们获取合同的新版本。

2. 性能 当Java自动转换为XML时,无法确定发送到网络的内容。一个对象可能引用另一个对象,而另一个对象又引用另一个对象,依此类推。最终,您虚拟机中堆上的一半对象可能会被转换为XML,这将导致响应时间变慢。 使用合同优先的方法,您可以明确描述XML发送的位置和内容,从而确保它正是您想要的。
3. 可重用性 在单独的文件中定义模式使您能够在不同的情境中重用该文件。
4. 版本控制 尽管合同应尽可能保持不变,但有时确实需要进行更改。在Java中,这通常会导致一个新的Java接口,例如AirlineService2,以及该接口的(新)实现。当然,旧的服务必须保留,因为可能还有未迁移的客户端。 如果使用合同优先的方法,我们可以在合同和实现之间实现较松散的耦合。这种较松散的耦合使我们能够在一个类中实现两个版本的合同。
关键区别:
  • 开发顺序:主要的区别在于设计和实现的顺序。自顶向下从设计开始,而自底向上从实现开始。
  • 合同方法:自顶向下采用先合同后实现的方法,即在实现之前设计合同。自底向上则是从已实现的代码中推导出合同。
  • 用例:自顶向下适用于首先定义清晰的接口或多个团队需要事先就合同达成一致的情况。自底向上适用于快速开发或者将现有代码作为服务公开的情况。

enter image description here


7

@mad_programmer - 你是指使用自下而上或自上而下的方法构建Web服务。 在自下而上的方法中,您首先编写Java代码中的类和业务逻辑,然后从中生成Web服务合同(即WSDL)。而后一种方法则相反(从WSDL生成类存根)。


5
支持andersen的答案,我想补充一点。 基本上人们倾向于使用自下而上的方法,因为在大多数情况下,我们已经开始编写bean、业务逻辑等流程,然后在持久化层中创建Web服务、WSDL等。 而在一个新项目中,你需要从头开始构建,我们可以使用自上而下的方法,只需编写WSDL即可,构建骨架将为您提供bean、实现、接口等。但是请记住,计算机不能生成您想要的逻辑。因此,仍然需要浏览整个项目并填补空缺。

4

当从零开始启动项目时,通常的方法是创建一个非常基本的界面,然后从中创建一个WSDl。这将使您免于编写复杂的WSDl。然后,我们可以直接在WSDl中添加项目特定的操作,一旦WSDl确定下来,我们就可以采用自上而下的方法。


我喜欢这个答案,因为它可以避免手动编写xsd和wsdl文件时的人为错误。但是,您认为生成的wsdl文件是否可在各种JAX-WS实现之间移植? - Yogendra

0
在自顶向下的开发模式中,您首先定义要做什么,例如您的 WSDL,然后再进行实际开发。虽然似乎很难先创建 WSDL,但建议您这样做(参考 Eclipse),因为从长远来看,它会简化您的开发流程。
而在自底向上的开发模式中,则恰好相反。我们从代码部分开始,然后使用内置工具创建 WSDL。虽然这在开始时可能很容易,但当您的代码复杂度增加时,它会带来很多混乱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接