【发布时间】:2014-12-01 10:34:01
【问题描述】:
当我尝试将我的 WSDL 导入 Salesforce 并从中生成 APEX 代码时,我遇到了一个问题。该问题针对 Salesforce,但我的一般问题与 Salesforce 无关,因为我相信我的问题有一个通用解决方案。当我将目标命名空间添加到以下文件中的第二个架构(Salesforce 需要)时,我需要更新引用以使我的请求仍然具有有效格式:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wss="http://www.boomi.com/connector/wss">
<soapenv:Header/>
<soapenv:Body>
<wss:querySearch>
<!--Optional:-->
<Car>
<Reg_Number></Reg_Number>
</Car>
</wss:querySearch>
</soapenv:Body>
</soapenv:Envelope>
我当前的 WSDL:
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.boomi.com/connector/wss" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="WebServiceProvider" targetNamespace="http://www.boomi.com/connector/wss" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xs:schema elementFormDefault="qualified" targetNamespace="http://www.boomi.com/connector/wss" version="1.0">
<xs:import />
<xs:element name="querySearch" type="tns:querySearch" />
<xs:complexType name="querySearch">
<xs:sequence>
<xs:element minOccurs="0" ref="Car" />
</xs:sequence>
</xs:complexType>
<xs:element name="querySearchResponse" type="tns:querySearchResponse" />
<xs:complexType name="querySearchResponse">
<xs:sequence>
<xs:element minOccurs="0" ref="Car" />
</xs:sequence>
</xs:complexType>
</xs:schema>
<xs:schema elementFormDefault="qualified" version="1.0">
<xs:element name="Car" type="Car" />
<xs:complexType name="Car">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="Reg_Number" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="querySearch">
<wsdl:part name="parameters" element="tns:querySearch" />
</wsdl:message>
<wsdl:message name="querySearchResponse">
<wsdl:part name="parameters" element="tns:querySearchResponse" />
</wsdl:message>
<wsdl:portType name="WebServiceProviderPortType">
<wsdl:operation name="querySearch">
<wsdl:input message="tns:querySearch" />
<wsdl:output message="tns:querySearchResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WebServiceProviderPortBinding" type="tns:WebServiceProviderPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="querySearch">
<soap:operation soapAction="querySearch" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="WebServiceProvider">
<wsdl:port name="WebServiceProviderPort" binding="tns:WebServiceProviderPortBinding">
<soap:address location="XXXXXXXX" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
当我将 WSDL 更改为以下内容时(添加目标命名空间并将“tns:”添加到类型中):
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.boomi.com/connector/wss" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="WebServiceProvider" targetNamespace="http://www.boomi.com/connector/wss">
<wsdl:types>
<xs:schema elementFormDefault="qualified" targetNamespace="http://www.boomi.com/connector/wss" version="1.0">
<xs:element name="Car" type="tns:Car"/>
<xs:complexType name="Car">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="Reg_Number" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="querySearch" type="tns:querySearch"/>
<xs:complexType name="querySearch">
<xs:sequence>
<xs:element minOccurs="0" ref="tns:Car"/>
</xs:sequence>
</xs:complexType>
<xs:element name="querySearchResponse" type="tns:querySearchResponse"/>
<xs:complexType name="querySearchResponse">
<xs:sequence>
<xs:element minOccurs="0" ref="tns:Car"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="querySearch">
<wsdl:part element="tns:querySearch" name="parameters"/>
</wsdl:message>
<wsdl:message name="querySearchResponse">
<wsdl:part element="tns:querySearchResponse" name="parameters"/>
</wsdl:message>
<wsdl:portType name="WebServiceProviderPortType">
<wsdl:operation name="querySearch">
<wsdl:input message="tns:querySearch"/>
<wsdl:output message="tns:querySearchResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WebServiceProviderPortBinding" type="tns:WebServiceProviderPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="querySearch">
<soap:operation soapAction="querySearch"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="WebServiceProvider">
<wsdl:port binding="tns:WebServiceProviderPortBinding" name="WebServiceProviderPort">
<soap:address location="XXXXXXXXXXXXXXXXX"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
它通过 Salesforce 但生成以下请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wss="http://www.boomi.com/connector/wss">
<soapenv:Header/>
<soapenv:Body>
<wss:querySearch>
<!--Optional:-->
<wss:Car>
<wss:Reg_Number>?</wss:Reg_Number>
</wss:Car>
</wss:querySearch>
</soapenv:Body>
</soapenv:Envelope>
它在 Car 元素和请求中的输入参数中添加“wss”前缀,从而使请求无效。我可以通过更改名称空间或类似的方式以某种方式解决这个问题吗? wsdl 是从 Dell Boomi 生成的,因此更喜欢那里的解决方案,但现在我很满意,如果我可以手动更改 WSDL。
Ciao!
【问题讨论】:
标签: xml web-services soap xsd wsdl