PHP SOAP XML根本不起作用


PHP SOAP XML not working at all

我需要创建一个SOAP XML模式来将PHP连接到SOAP Server。我在PHP文档中读到了SOAPClient类,但还不清楚如何真正创建像我需要的XML Schema。我也读过关于SOAPVar的文章,但我没能让它发挥作用,可能是因为这是我第一次使用PHP SOAP
我从服务器调用的函数名为insertContact,它需要一个字符串password和一个Contact对象,其中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>

我不知道如何做这个模式,我只知道如何创建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:)