Web服务接口 - 复杂类型作为参数?

时间:2009-05-19 08:26:15

标签: web-services

只是寻找有关Web服务界面设计的最佳实践的一些反馈。

我有两个选择:

选项1

public string GetSomeData(SomeCriteriaClass criteria);

其中SomeCriteriaClass定义为:

public int ID;
public string Name;
public string Property2; etc.

选项2

public string GetSomeData(int id, string name, string property2)

哪个首选?这似乎是设计模式的冲突 - 1是在一个类中包装参数,而另一个是保持Web服务接口的灵活性和开放性。

第二个问题是 - 如果我们选择Option1 - 你如何通过URL调用它?

由于

3 个答案:

答案 0 :(得分:2)

您可以使用SOAP,努力实现选项#1。使用SOAP,您可以定义复杂的数据类型。 另一方面,您可以像选项#2那样使用“hack”方式,使用REST并在URL或HTTP POST消息中对参数进行编码。

答案 1 :(得分:2)

术语“网络服务”通常用于两种不同的事情。

  • 一项技术:使用HTTP(S)作为进程间通信的协议。

  • 架构方法:面向服务的架构。

如果我们将Web服务称为技术,那么您有很多选择:您可以使用HTTP GET(这是使用URL params的那个)或HTTP POST(数据位于HTTP的主体中)信息)。对于HTTP POST,有效负载可以是SOAP,也可以是任何适用的东西。

如果我们谈论面向服务的方法和Web服务作为工具,那么HTTP + SOAP是最标准的方法。

如果我们将Web服务方法仅仅视为服务操作的实现,那么请使用下面强调此方法的签名:

public FooResponse FooOperation(FooRequest request);

这意味着操作有一个请求和一个响应文档(即使其中任何一个是空的),您可以将服务合同(您公开的操作)和数据合同分开(如何组合请求和响应消息)。有关详细信息,请参阅此文章:Principles of Service Design Service Patterns and Anti-Patterns

结论:

  • 如果你不关心SOA,只想通过HTTP调用方法,那么选项2就很简单了。
  • 但是如果您正在构建SOA服务,那么请使用“以文档为中心”的签名。选项1是两者的混合,不推荐使用。

答案 2 :(得分:1)

选项1公共字符串GetSomeData(SomeCriteriaClass标准); 这是实现webservice的好方法,因为你在使用SOAP和面向文档的术语。而option2适用于那些不太专注于设计模式的基础java开发人员。

让我们看一下场景 - 使用选项2之后,假设您想在SomeCriteriaClass.java中再添加3个varibale,那么您将选择哪种方式..将另外3个参数添加到GetSomeData()方法或在SomeCriteriaClass.java中声明。 / p>

一个好的设计模式关注者,选择在SomeCriteriaClass.java中声明不要在GetSomeData()中添加。