重新创建从SoapUI到PHP的工作SOAP请求


Recreate a working SOAP request from SoapUI to PHP

我已经用PHP创建了一个可以登录的soap客户端,但对于我想要发出的第二个请求,我似乎无法让PHP正确地构建请求。

这是在SoapUI 中工作的请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://v1.productapi.gs1ca.org" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:searchProducts>
         <sessionId>f53c5450-392e-4ca4-b592-adbb436cfe1f</sessionId>
         <searchCriteria>
            <v1:AttributeValue>
               <v1:attribute>dateupdated</v1:attribute>
               <v1:value i:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">08/01/2013</v1:value>
            </v1:AttributeValue>
<v1:AttributeValue>
               <v1:attribute>dateupdatedcompare</v1:attribute>
               <v1:value  i:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">1</v1:value>
            </v1:AttributeValue>
         </searchCriteria>
         <includeImageAttributes>0</includeImageAttributes>
         <sortOrder>dateupdated</sortOrder>
      </v1:searchProducts>
   </soapenv:Body>
</soapenv:Envelope>

如何使用PHP以与工作请求相同的方式格式化XML?

已经取得了一些进展。

到目前为止,我已经能够重新创建xml了。请求如下:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://v1.productapi.gs1ca.org">
    <SOAP-ENV:Body>
        <ns1:searchProducts>
            <sessionId>2a7d0294-8d96-428d-abd8-08add9cfc427</sessionId>
            <searchCriteria>
                <ns1:AttributeValue>
                    <ns1:attribute>dateupdated</ns1:attribute>
                    <ns1:value>01/01/2013</ns1:value>
                </ns1:AttributeValue>
                <ns1:AttributeValue>
                    <ns1:attribute>dateupdatedcompare</ns1:attribute>
                    <ns1:value>1</ns1:value>
                </ns1:AttributeValue>
            </searchCriteria>
            <includeImageAttributes>false</includeImageAttributes>
            <sortOrder>dateupdated</sortOrder>
        </ns1:searchProducts>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

创建该请求的PHP是:

    $args0 = array(
        'sessionid'=>$session,
        'searchcriteria'=> array(array('attribute'=>'dateupdated','value'=>'01/01/2013'),array('attribute'=>'dateupdatedcompare','value'=>'1')),
        'includeimageattributes'=>0,
        'sortorder'=>'dateupdated');
$result = $client->__soapCall('searchProducts',$args0);

这引发的错误是:

Error: SoapFault exception: [a:DeserializationFailed] The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://v1.productapi.gs1ca.org:searchCriteria. The InnerException message was 'Element value from namespace http://v1.productapi.gs1ca.org cannot have child contents to be deserialized as an object. Please use XmlNode[] to deserialize this pattern of XML.

我仍然缺少信封的一部分:

xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

我需要值标签看起来像这样:

<v1:value i:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">

关于如何添加这些部分,有什么想法吗?

好的!我终于想通了。它很难看,但很管用。

   try {
        $args = array(
            'sessionid'=>$session,
            'searchcriteria'=> new SoapVar('<searchCriteria><ns1:AttributeValue>
                                                <ns1:attribute>dateupdated</ns1:attribute>
                                                <ns1:value xsi:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">01/01/2013</ns1:value>
                                            </ns1:AttributeValue>
                                            <ns1:AttributeValue>
                                                <ns1:attribute>dateupdatedcompare</ns1:attribute>
                                                <ns1:value xsi:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">1</ns1:value>
                                            </ns1:AttributeValue></searchCriteria>
                                            ', XSD_ANYXML, "http://www.w3.org/2001/XMLSchema-instance"),
            'includeimageattributes'=>0,
            'sortorder'=>'dateupdated');
    $result = $client->__soapCall('searchProducts',$args);
    } catch (SoapFault $e) {
        echo "Error: {$e}";
    }