我需要创建一个SOAP XML
模式来将PHP连接到SOAP Server
。我在PHP文档中读到了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>
我不知道如何做这个模式,我只知道如何创建Header,但什么都不知道。这是我迄今为止尝试过的:
$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进行硬编码?)
经过三周的紧张工作,我发现了问题。
我在使用WSDL,记住,WSDL对我来说是一把双刃剑。正如文档中所读到的,使用它可以让SoapClient
自动找到端点、SoapServer
所需的所有函数和所有类型,这很好。
我的问题是终点,我真的,真的建议你仔细检查一下,因为我的问题不对。我不得不强迫它,因为我只得到了unable to connect to host
错误,而没有其他错误。
所以这是我的代码使它工作。最后
class SoapClientDebug extends SoapClient {
function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
$this->server = new SoapServer($wsdl, $options);
}
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$location=THE_CORRECT_ENDPOINT;
return parent::__doRequest($request, $location, $action, $version, $one_way = 0);
}
}
相信我,检查一下。我已经因为寻找一个问题而损失了3周的工作,而这个问题其实很简单。
无论如何,我仍然讨厌PHP上的SOAP:)