【问题标题】:Recreate a working SOAP request from SoapUI to PHP重新创建从 SoapUI 到 PHP 的有效 SOAP 请求
【发布时间】:2013-08-25 07:50:40
【问题描述】:

我在 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">

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

【问题讨论】:

    标签: php xml soap webservice-client


    【解决方案1】:

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

       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}";
        }
    

    【讨论】:

    • 没有更好的方法来实现 __soapCall?当结构变得更复杂时,最好使用更模块化的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2012-06-03
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多