PHP SOAP XML根本不起作用

时间:2015-11-25 15:50:18

标签: php xml web-services soap

我需要创建一个SOAP XML架构来将PHP连接到SOAP Server。我在PHP docs中了解了SOAPClient课程,但目前还不清楚如何像我需要的那样真正创建XML Schema。我还读过有关SOAPVar但我无法使其正常工作的信息,可能是因为这是我第一次使用PHP SOAP。 我从服务器调用的函数名为insertContact,需要字符串passwordContact对象,其中sourceemailAddress1是只有必填字段。

无论如何,这应该是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进行硬编码?)

1 个答案:

答案 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:)