与PHP一起食用此肥皂服务的正确方法



我正在尝试使用PHP消费此Web服务。首先,我需要调用API方法进行登录。这是我的代码:

     try {
    $opts = array(
        'http' => array(
            'user_agent' => 'PHPSoapClient'
        )
    );
    $context = stream_context_create($opts);
    $wsdlUrl = 'http://172.20.2.18:1024/ADInterface/services/ModelADService?wsdl';
    $soapClientOptions = array(
        'stream_context' => $context,
        'cache_wsdl' => WSDL_CACHE_NONE);
    $checkVatParameters = array(
        'user'=>'WebService',
        'pass'=>'WebService',
        'lang'=>'es_CL',
        'ClientID'=>'1000000',
        'RoleID'=>'1000014',
        'OrgID'=>'1000000',
        'WarehouseID'=>'1000001',
        'stage'=>'0');
    $modelCrud = array(
        'serviceType' => 'WSBPartner',
        'TableName' => 'XX_WEB_WSBPartner',
        'RecordID' => 0,
        'Filter' => '',
        'Action' => 'Read',
        'DataRow' => array(
               'field' => array(
                   'type' => 'integer',
                   'column' => 'C_BPartner_ID',
                   'lval' => '',
                   'disp' => '',
                   'edit' => '',
                   'error' => '',
                   'errorVal' => '',
                   'val' => 1000643,
               )
           )
      );
    $client = new SoapClient($wsdlUrl, $soapClientOptions);
    $result = $client->queryData(
        'ModelCRUDRequest', array(
            'ModelCRUD' => $modelCrud,
            'ADLoginRequest' => $checkVatParameters,
        )
    );
    print_r($result);
}
catch(Exception $e) {
    echo $e->getMessage();
}

这是错误:参数modelcrudrequest不存在!

我希望能够调用queryData这样的方法。希望我能很好地解释,这是我第一次使用WebServices。

有时SoapClient只是一个"损坏的工具"。我将尝试将卷发或guzzle用作HTTP客户端,并手动构建肥皂请求。我已经使用SOAPUI根据WSDL生成样本肥皂请求。

示例

<?php
// Change the url
$endpoint = 'http://172.20.2.18:1024/ADInterface/services/ModelADService';
$soapMethod = 'queryData';
// Basic Auth (optional)
$soapUser = ''.
$soapPassword = '';
// Created with SoapUI
$soap = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:adin="http://3e.pl/ADInterface">
   <soapenv:Header/>
   <soapenv:Body>
      <adin:queryData>
         <adin:ModelCRUDRequest>
            <adin:ModelCRUD>
               <adin:serviceType>?</adin:serviceType>
               <adin:TableName>?</adin:TableName>
               <adin:RecordID>?</adin:RecordID>
               <adin:Filter>?</adin:Filter>
               <adin:Action>?</adin:Action>
               <!--Optional:-->
               <adin:DataRow>
                  <!--Zero or more repetitions:-->
                  <adin:field type="?" column="?" lval="?" disp="?" edit="?" error="?" errorVal="?">
                     <adin:val>?</adin:val>
                     <!--Optional:-->
                     <adin:lookup>
                        <!--Zero or more repetitions:-->
                        <adin:lv val="?" key="?"/>
                     </adin:lookup>
                  </adin:field>
               </adin:DataRow>
            </adin:ModelCRUD>
            <adin:ADLoginRequest>
               <adin:user>?</adin:user>
               <adin:pass>?</adin:pass>
               <adin:lang>?</adin:lang>
               <adin:ClientID>?</adin:ClientID>
               <adin:RoleID>?</adin:RoleID>
               <adin:OrgID>?</adin:OrgID>
               <adin:WarehouseID>?</adin:WarehouseID>
               <adin:stage>?</adin:stage>
            </adin:ADLoginRequest>
         </adin:ModelCRUDRequest>
      </adin:queryData>
   </soapenv:Body>
</soapenv:Envelope>';
$headers = array(
    'Content-type: text/xml;charset="utf-8"',
    'Accept: text/xml',
    'Cache-Control: no-cache',
    'Pragma: no-cache',
    // Maybe change this url
    'SOAPAction: ' . $endpoint . '/' . $soapMethod,
    'Content-length: ' .strlen($soap),
); 
// PHP cURL for https connection with auth
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
// Basic Auth (optional)
curl_setopt($ch, CURLOPT_USERPWD, $soapUser. ':' .$soapPassword);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soap);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// Invoke request
$response = curl_exec($ch);
if($response === false) {
    echo 'HTTP error: ' . curl_error($ch);
    exit;
}
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$xml = trim(substr($response, $headerSize));
curl_close($ch);
// Convert response to DOM document
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);
echo $dom->saveXML();