使用 PHP 使用此 SOAP 服务的正确方法
Right way to consume this SOAP service with 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();
}
here's the error: Parameter ModelCRUDRequest does not exist!
我希望能够像 queryData
那样调用那些方法。我希望我解释得很好,这是我第一次使用网络服务。
有时 SoapClient
只是 "broken tool"。我会尝试使用 curl 或 Guzzle 作为 HTTP 客户端并手动构建 SOAP 请求。我用过SoapUI to generate a sample SOAP request according to the 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();
我正在尝试通过 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();
}
here's the error: Parameter ModelCRUDRequest does not exist!
我希望能够像 queryData
那样调用那些方法。我希望我解释得很好,这是我第一次使用网络服务。
有时 SoapClient
只是 "broken tool"。我会尝试使用 curl 或 Guzzle 作为 HTTP 客户端并手动构建 SOAP 请求。我用过SoapUI to generate a sample SOAP request according to the 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();