使用名称值对列表开发灵活的SOAP服务器/客户端?

时间:2012-07-03 13:16:55

标签: php mysql soap nusoap complextype

问题:我正在尝试找到一种更好的方法来管理多个Web站点(域/ ips)共享的多个SOAP客户端/服务器的更改。幸运的是,我控制了所有SOAP服务器/客户端,但我偶尔需要在一些复杂类型中添加一个或两个新字段。

添加字段会导致相关站点之间出现依赖性问题。 SOAP服务器中没有新字段会导致错误发生。部署到dev,demo,prod版本的这些网站会导致依赖性噩梦发生。

我已经看到了SugarCRM设置其复杂类型的方式,并注意到它们具有名称/值对的列表。我正在考虑采用类似的方法,但希望从Stackoverflow上的人那里获得一些反馈。我主要使用PHP / MySQL。

这种方法有问题吗?我认为这将允许我定义任意数量的名称/值对。我假设它可能导致SOAPClient类映射存在问题?

<xsd:complexType name="name_value">
    <xsd:all>
        <xsd:element name="name" type="xsd:string"/>
        <xsd:element name="value" type="xsd:string"/>
    </xsd:all>
</xsd:complexType>

<xsd:complexType name="name_value_list">
    <xsd:complexContent>
        <xsd:restriction base="SOAP-ENC:Array">
        <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:name_value[]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="name_value_lists">
    <xsd:complexContent>
        <xsd:restriction base="SOAP-ENC:Array">
        <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:name_value_list[]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

1 个答案:

答案 0 :(得分:0)

当您进行向后不兼容的更改时,您应该将端点移动到新的URL或提供其他类型的标记;在某些地方,声明所需版本的XML属性附加到band中的第一个元素。在其他情况下,它是HTTP POST请求中包含的标头(或者更少见的是查询字符串)。然后,您必须在多个位置考虑API的多个版本。

作为旁注(不要试图在这里开始战争):这是REST架构真正闪耀的地方:所有版本控制都由MIME类型处理。如果资源不能支持给定的MIME类型,它可以向请求者发出这一事实,并代之以协商更兼容的版本。