【问题标题】:Web Service: Single String Parameter Or Complex Type ParametersWeb 服务:单个字符串参数或复杂类型参数
【发布时间】:2010-08-16 15:21:04
【问题描述】:

使用这些方法签名创建公开的 Web 服务是否或多或少可以接受(即标准):

ThisMethodDoesSomething(ComplexType param)

ThisMethodDoesSomethingElse(AnotherComplexType param)

或者这个:

ThisMethodDoesSomethingAndSomethingElse(string xml)

正在执行的操作取决于传递给单个全能方法的 XML 字符串?我一直选择前者,但我的一位同事更喜欢后者,在我们开始一个新项目之前,我正试图权衡这两种策略的利弊。哪个更容易被公众接受和合作?为什么?

【问题讨论】:

    标签: xml web-services soap parameters web-standards


    【解决方案1】:

    我永远不会发送 XML 字符串。首先,“XML”与“字符串”不同。他们不遵循相同的规则。

    任何合理的客户端都可以接受由原始类型和原始类型的列表或数组组成的复杂类型,递归方式(C# 语法):

    public class ComplexType1
    {
        public int IntegerProperty {get;set;}
        public int[] ArrayOfIntegers {get;set;}
        public List<int> ListOfIntegers {get;set;} // Same as ArrayOfIntegers
    }
    
    public class ComplexType2
    {
        public ComplexType1 CT1 {get;set;}
        public List<ComplexType1> LCT1 {get;set;}
    }
    

    坦率地说,任何不能处理上述问题的客户都应该退休。

    【讨论】:

      【解决方案2】:

      以前我更喜欢后者,因为我不确定,如果在跨平台情况下,每个 SOAP 客户端都能够正确使用复杂类型。所以我认为一个只接受并返回(XML-)字符串的 SOAP 调用不会让我头疼。与此同时,我体验到第一种方法通常没有问题,至少对于 .Net 与 JAVA/AXIS 的互操作,反之亦然。不过,我仍在努力让复杂类型不要太复杂。

      我假设ThisMethodDoesSomething()ThisMethodDoesSomethingElse() 是原子操作?如果不是这种情况(ThisMethodDoesSomethingElse() 需要调用 ThisMethodDoesSomething() 来执行),第一种方法是不行的。

      【讨论】:

        【解决方案3】:

        我更喜欢(这是操作词,prefer,因为对此没有标准)解释操作的复杂 XML 字符串。你可以从my open-source project看到这个。

        我喜欢它的一些原因......

        1. 您的操作是一种可以灵活调整的解释性语言。
        2. 可以将操作组合成一个网络行程。
        3. XML 允许扩展功能集,同时不破坏过去的功能。
        4. XML 层次结构允许动作作用于服务器端的动作。

        【讨论】:

        • 感谢您的回复。从表面上看,这对我来说是错误的,有点像:为什么我应该在我的程序中传递 int 或 double 而 object 可以呢?对象更灵活,对吧?我不倾向于这种方法的另一个原因是 Method(string) 不像 Method(int) 或 Method(otherType) 那样自我记录。您的第 1 点和第 3 点是有道理的。您能稍微扩展一下第 2 点和第 4 点吗?
        【解决方案4】:

        乍一看,您的问题在我看来像是粗粒度与细粒度接口的问题。另一方面,如果你明白我的意思,我觉得第二种方法将粗粒度发挥到了极致。你失去了所有类型检查。您使实现变得非常困难 - 您需要在支持代码中使用大量 if 案例才能真正弄清楚请求的内容。该方法将返回什么?我猜如果你只是得到一个字符串作为参数,你会返回另一个字符串。因为它是一个字符串,而且我猜它是一个 XML 文档的字符串表示,所以您将不得不解析您的支持代码的一部分。随着接口变得越来越大,我想这些将变成上帝的方法。名单还在继续:)

        附带说明,不要认为我在提倡非常细粒度的界面。两者之间必须取得平衡。我的经验法则是总是传递一个元素。

        【讨论】:

          【解决方案5】:

          我通常创建一个 xml 模式来描述将形成我的界面的消息。然后,使用 xsd 到类生成器(例如 Castor 或 Microsoft xsd.exe),我创建了我的实现类。

          【讨论】:

            猜你喜欢
            • 2014-07-05
            • 1970-01-01
            • 2021-10-21
            • 2021-10-13
            • 1970-01-01
            • 2021-09-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多