我是SOAP的新手,正在尝试将其与PHP连接,但没有取得积极的结果。也许你可以帮我
SOAP 1.2请求
POST /XXXservice.asmx HTTP/1.1
Host: XXX.prueba.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetAcData xmlns="https://prueba.com/">
<Userid>string</Userid>
<Password>string</Password>
</GetAcData>
</soap12:Body>
</soap12:Envelope>
SOAP 1.2响应
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetAcDataResponse xmlns="https://prueba.com/">
<XX>xml</GetAcDataResult>
</GetAcDataResponse>
</soap12:Body>
</soap12:Envelope>
我使用了以下代码,但我收到了此消息:
SOAP错误:解析WSDL:无法从'https://XXX.YYYY.com/XXXservice.asmx'加载:标记html第3行中的数据过早结束
<?php
$options = array(
'Userid' => 'xx',
'Password' => 'xx',
);
$client = new SoapClient("https://XXX.YYYY.com/XXXservice.asmx", $options);
$result = $client('GetAcData');
?>
答案 0 :(得分:0)
首先,您需要Web服务的端点URL,该URL为您提供wsdl内容。如@camelsWrittenInCamelCase在其评论中所写,您应该尝试使用https://XXX.YYYY.com/XXXservice.asmx?wsdl
而不是https://XXX.YYYY.com/XXXservice.asmx
。
接下来,您应该将所有soap客户端内容包装在try / catch块中,以获取所有可能的异常以及发生错误时的最多信息。
try {
$client = new \SoapClient(
'https://XXX.YYYY.com/XXXservice.asmx?wsdl',
[
'cache_wsdl' => WSDL_CACHE_NONE,
'exceptions' => true,
'soap_version' => SOAP_1_2,
'trace' => true,
]
);
} catch (\SoapFault $fault) {
echo "<pre>";
var_dump($fault);
echo "</pre>";
echo "<pre>";
var_dump($client->__getLastRequest());
echo "</pre>";
echo "<pre>";
var_dump($client->__getLastResponse());
echo "</pre>";
}
如上面的示例所示,soap客户端使用options数组初始化。我们使用trace选项,以启用跟踪以获取最后的发送请求和响应。另外,wie使用exception选项,以强制客户端在发生任何错误的情况下引发异常。此外,只要您正在开发,我们都会禁用对wsdl设置的缓存。如果您要投入生产,则应将此选项设置为WSDL_CACHE_DISK
或WSDL_CACHE_MEMORY
。
现在您需要知道Web服务提供哪些功能和类型(复杂类型)。为此,您可以执行以下操作。
// getting the functions of your webservice
echo "<pre>";
var_dump( $client->__getFunctions() );
echo "</pre>";
// getting the types of your webservice
echo "<pre>";
var_dump( $client->__getTypes() );
echo "</pre>";
由于我不知道您的Web服务的确切范围,因此我仅假设Web服务提供了一种名为DetAcData
的方法,该方法具有两个参数Userid
和Password
。有了这些信息,我只能猜测正确的呼叫看起来如何。有关详细信息,我需要输出__getFunctions()
和__getTypes()
。
示例电话可能如下所示。
try {
$client = new \SoapClient(
'https://XXX.YYYY.com/XXXservice.asmx?wsdl',
[
'cache_wsdl' => WSDL_CACHE_NONE,
'exceptions' => true,
'soap_version' => SOAP_1_2,
'trace' => true,
]
);
$data = new \stdClass();
$data->Userid = 'YourUserId';
$data->Username = 'YourUsername';
$result = $client->GetAcData($data);
// $result will be an object
echo "<pre>";
var_dump($result);
echo "</pre>";
} catch (\SoapFault $fault) {
// error handling
}
您还可以为Web服务输出的函数和类型中提到的每种复杂类型编写数据对象。您可以在实例化soap客户端时将classmap添加到options数组中,以便每个响应和请求将自动在相应的数据对象中进行解析。 php文档中介绍了soap客户端类映射的工作方式。
试试看。我敢肯定,您将自己获得它。 ;)