我需要创建一个SOAP XML
架构来将PHP连接到SOAP Server
。我在PHP docs中了解了SOAPClient
课程,但目前还不清楚如何像我需要的那样真正创建XML Schema
。我还读过有关SOAPVar
但我无法使其正常工作的信息,可能是因为这是我第一次使用PHP SOAP
。
我从服务器调用的函数名为insertContact
,需要字符串password
和Contact
对象,其中source
和emailAddress1
是只有必填字段。
无论如何,这应该是XML
架构:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<ns9:HeaderInfo xmlns:ns9="http://example.com/" xmlns:ns8="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:ns7="http://tempuri.org/" xmlns:ns6="http://schemas.datacontract.org/2004/07/FileServiceWcfServiceLibrary.Domain" xmlns:ns5="http://example.com.Utilities" xmlns:ns4="http://example.com.Entity" xmlns:ns3="http://example.com" xmlns:ns2="http://example.com.PrimaryKey">
<infos>
<entries>
<key>apiKey</key>
<value>key</value>
</entries>
<entries>
<key>apiSecret</key>
<value>secret</value>
</entries>
</infos>
<type>source</type>
</ns9:HeaderInfo>
</soap:Header>
<soap:Body>
<ns1:insertContact xmlns:ns1="http://example.com/">
<password xmlns:ns2="http://example.com.PrimaryKey" xmlns:ns3="http://example.com" xmlns:ns4="http://example.com.Entity" xmlns:ns5="http://example.com.Utilities" xmlns:ns6="http://schemas.datacontract.org/2004/07/FileServiceWcfServiceLibrary.Domain" xmlns:ns7="http://tempuri.org/" xmlns:ns8="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:ns9="http://example.com/">password</password>
<contact xmlns:ns2="http://example.com.PrimaryKey" xmlns:ns3="http://example.com" xmlns:ns4="http://example.com.Entity" xmlns:ns5="http://example.com.Utilities" xmlns:ns6="http://schemas.datacontract.org/2004/07/FileServiceWcfServiceLibrary.Domain" xmlns:ns7="http://tempuri.org/" xmlns:ns8="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:ns9="http://example.com/">
<ns3:Address1_City xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Address1_Line1 xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Address1_PostalCode xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Address1_StateOrProvince xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Address1_Telephone1 xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Birthdate xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Country>
<ns2:CountryCode>GB</ns2:CountryCode>
</ns3:Country>
<ns3:CreatedBy xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:CreatedOn xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:EmailAddress1>email@example.com</ns3:EmailAddress1>
<ns3:FacebookId xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:FirstName>FirstName</ns3:FirstName>
<ns3:FiscalCode xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:GooglePlusId xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Id xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:IdBadgeminton xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:isM xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:isMotoM xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:IsPir xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:IsCar xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:isF1 xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:isMoto></ns3:isMoto>
<ns3:isTyre xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:LangCode>en</ns3:LangCode>
<ns3:LastName>LastName</ns3:LastName>
<ns3:MobilePhone xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:ModifiedBy xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:ModifiedOn xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:NickName xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:Privacy>true</ns3:Privacy>
<ns3:PrivacyGroup>false</ns3:PrivacyGroup>
<ns3:PrivacyThird>false</ns3:PrivacyThird>
<ns3:Source>SoapUI</ns3:Source>
<ns3:StateCode xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:StatusCode xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:SubscriptionConfirmed xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns3:TwitterId xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</contact>
</ns1:insertContact>
</soap:Body>
</soap:Envelope>
我不知道如何做这个架构,我只是理解如何创建Headers,但完全没有。这就是我到目前为止所做的:
$soapClient=new SoapClient(WSDL_URI,array(
'trace' => true,
'login' => 'user',
'password' => 'password'
));
$soapHeader=new SOAPHeader(API_NAMESPACE,'HeaderInfo',array(
'infos' => array(
'entries' => array(
'key' => 'apiKey',
'value' => APIKEY
),
'entries' => array(
'key' => 'apiSecret',
'value' => APISECRET
)
),
'type' => 'source'
));
$soapClient->__setSoapHeaders($soapHeader);
$soapContactParams=[];
$soapContactParams[]=new SoapVar('email@example.com',XSD_STRING,null,null,'EmailAddress1');
$soapContactParams[]=new SoapVar('source',XSD_STRING,null,null,'Source');
$soapContact=new SoapVar($soapContactParams,SOAP_ENC_OBJECT,null,null,'contact');
$soapClient->insertContact(password,$soapContact);
这给了我这个错误:
Fatal error: Uncaught SoapFault exception: [soap:Server] Fault occurred while processing. in /var/www/example.com/example.com/test/index.php:34 Stack trace: #0 /var/www/example.com/example.com/test/index.php(34): SoapClient->__call('insertContact', Array) #1 /var/www/example.com/example.com/test/index.php(34): SoapClient->insertContact('password', Object(SoapVar)) #2 {main} thrown in /var/www/example.com/example.com/test/index.php on line 34
我实际上对PHP SOAP
很新,让我说出来,我根本不喜欢它。我甚至不知道我是否构建格式良好的XML,因为我无法打印它。
我已经取消了之前所做的所有编辑工作,因为他们都指向了相同的方向:根本没有任何作用。
所以我尝试复制他们的示例XML
,但它确实有效。我想我会停止尝试理解SOAP
,至少对于PHP
,因为它非常烦人,无聊,而且根本没有完整记录。 (为什么我需要对XML进行硬编码?)
答案 0 :(得分:0)
经过3周的紧张工作,我发现了问题。
我正在使用WSDL,记住它,WSDL对我来说是一把双刃剑。正如文档中所述,使用它会让 | date | M_ids_count | A_ids_count | M_trips_count | A_trips_count |
=========================================================================
2015-11-30 | 8 | 0 | 7 | 0
2015-12-03 | 0 | 5 | 0 | 5
自动找到端点,所有函数以及SoapClient
所需的所有类型,这很好。
我的问题是端点,我真的,真的建议你仔细检查一下,因为我的不对。我不得不强迫它,因为我只得到SoapServer
个错误,仅此而已。
unable to connect to host
相信我,检查一下。当问题真的很简单时,我通过寻找问题失去了3周的工作。
无论如何,我仍然讨厌PHP上的SOAP:)