我正在尝试解析WSDL文件以构建PHP类。尽管有很多工具可以解决这些问题,但是它们目前都无法记录用于请求和/或响应的可用SOAPHeader和SOAPFaults。
我对构建此https://github.com/rquadling/wsdl2php已有足够的了解。但是后来我遇到了与我以前的知识不符的服务。
所以一个示例WSDL文件(仅作为登录方法和一些导入)。
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns:tns="urn:platform_2012_2.webservices.netsuite.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:platformMsgs="urn:messages_2012_2.platform.webservices.netsuite.com"
xmlns:platformFaults="urn:faults_2012_2.platform.webservices.netsuite.com"
targetNamespace="urn:platform_2012_2.webservices.netsuite.com">
<types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:import namespace="urn:core_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/core.xsd"/>
<xsd:import namespace="urn:faults_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/faults.xsd"/>
<xsd:import namespace="urn:messages_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/messages.xsd"/>
<xsd:import namespace="urn:common_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/common.xsd"/>
<!-- snip -->
</xsd:schema>
</types>
<message name="headers">
<part name="applicationInfo" element="platformMsgs:applicationInfo"/>
<part name="partnerInfo" element="platformMsgs:partnerInfo"/>
<part name="documentInfo" element="platformMsgs:documentInfo"/>
<part name="preferences" element="platformMsgs:preferences"/>
<part name="searchPreferences" element="platformMsgs:searchPreferences"/>
<part name="passport" element="platformMsgs:passport"/>
</message>
<message name="loginRequest">
<part name="parameters" element="platformMsgs:login"/>
</message>
<message name="loginResponse">
<part name="parameters" element="platformMsgs:loginResponse"/>
</message>
<!-- snip -->
<portType name="NetSuitePortType">
<operation name="login">
<input name="loginRequest" message="tns:loginRequest"/>
<output name="loginResponse" message="tns:loginResponse"/>
<fault name="InsufficientPermissionFault" message="tns:InsufficientPermissionFault"/>
<fault name="InvalidAccountFault" message="tns:InvalidAccountFault"/>
<fault name="InvalidCredentialsFault" message="tns:InvalidCredentialsFault"/>
<fault name="InvalidVersionFault" message="tns:InvalidVersionFault"/>
<fault name="ExceededRequestLimitFault" message="tns:ExceededRequestLimitFault"/>
<fault name="UnexpectedErrorFault" message="tns:UnexpectedErrorFault"/>
</operation>
<!-- snip -->
</portType>
<binding name="NetSuiteBinding" type="tns:NetSuitePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="login">
<soap:operation soapAction="login"/>
<input name="loginRequest">
<soap:header message="tns:headers" part="applicationInfo" use="literal"/>
<soap:header message="tns:headers" part="partnerInfo" use="literal"/>
<soap:body use="literal"/>
</input>
<output name="loginResponse">
<soap:body use="literal"/>
</output>
<fault name="InsufficientPermissionFault">
<soap:fault name="InsufficientPermissionFault" use="literal"/>
</fault>
<fault name="InvalidAccountFault">
<soap:fault name="InvalidAccountFault" use="literal"/>
</fault>
<fault name="InvalidCredentialsFault">
<soap:fault name="InvalidCredentialsFault" use="literal"/>
</fault>
<fault name="InvalidVersionFault">
<soap:fault name="InvalidVersionFault" use="literal"/>
</fault>
<fault name="ExceededRequestLimitFault">
<soap:fault name="ExceededRequestLimitFault" use="literal"/>
</fault>
<fault name="UnexpectedErrorFault">
<soap:fault name="UnexpectedErrorFault" use="literal"/>
</fault>
</operation>
<!-- snip -->
</binding>
<service name="NetSuiteService">
<port name="NetSuitePort" binding="tns:NetSuiteBinding">
<soap:address location="https://webservices.eu2.netsuite.com/services/NetSuitePort_2012_2"/>
</port>
</service>
</definitions>
我正在使用XPath提取标题(输入和输出)和错误...
$xPathMaster['Headers'] = [
'headers_in' => [
'Definitions/Binding/Operation[method]/Input/Header' => '//*[local-name()="definitions"]/*[local-name()="binding"]/*[local-name()="operation"][@name="'.$call.'"]/*[local-name()="input"]/*[local-name()="header"]/@part',
],
'headers_out' => [
'Definitions/Binding/Operation[method]/Output/Header' => '//*[local-name()="definitions"]/*[local-name()="binding"]/*[local-name()="operation"][@name="'.$call.'"]/*[local-name()="output"]/*[local-name()="header"]/@part',
],
'faults' => [
'Definitions/Binding/Operation[method]/fault' => '//*[local-name()="definitions"]/*[local-name()="binding"]/*[local-name()="operation"][@name="'.$call.'"]/*[local-name()="fault"]/@name',
],
];
([$call
是要调用的方法的名称。)>
所以我的工具知道标题applicationInfo
与loginResponse
相关联。
我不确定该怎么做是以编程方式找到该类型的结构。
手动,我知道它以映射类型存在于从https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/messages.xsd ...导入的消息命名空间中>
<!-- snip --> <complexType name="ApplicationInfo"> <sequence> <element name="applicationId" minOccurs="0" type="xsd:string"/> </sequence> </complexType> <element name="applicationInfo" type="platformMsgs:ApplicationInfo"/>
我正在使用PHP的SOAP技术,它能够为我提供类型列表(
$client->__getTypes()
,但这将结构显示为...struct ApplicationInfo { string applicationId; }
((因此它必须在内部运行导入),但不提及
applicationInfo
。因此,尝试使用XPath查询通过PHP的DOM做到这一点,而我迷失了如何“扩展”导入,以便显示实际的内容,而不是引用。
我有点迷路。
我正在尝试解析WSDL文件以构建PHP类。尽管有很多工具可以解决这些问题,但是它们目前都无法记录现有的可用SOAPHeader和SOAPFaults ...
我根本不是PHP专家,但是我认为PHP SOAP技术做得很好。 XSD中的类型列表(XSD类型定义
)不应包含applicationInfo,因为applicationInfo是XSD元素声明