相对于REST API, SOAP 是一种比较复杂的 Web Service 接口,理论上,我们可以使用 PHP 的SoapClient 类来访问 SOAP 接口获取数据。
在开发一个WordPress主题的时候,我们尝试过使用这个类来访问一下用户同步的 API,可经过多次尝试,都不能成功,遂放弃,尝试使用 WordPress 的 wp_remote_post 函数来访问这个接口,很快成功了。
准备需要发送的SOAP接口的数据
根据SOAP接口文档,我们先准备好需要发送到SOAP的数据,如下,这些数据是一个标准的PHP数组。每个SOAP接口需要的数据不一样,下面的数据只是示例,具体使用的时候,请根据自己的需要准备这些数据。
$params = [
'data' => [
'header' => [
'security' => [],
'time' => '2017-12-06',
'sender' => 'user1',
'where' => "time between '2020-07-25 00:00:00' and '2020-07-30 13:59:03'",
],
],
];
转换后的,需要实际发送的SOAP接口的 XML 数据
由于SOAP使用的是XML格式的数据,在发送数据之前,我们需要先把上面的数组转化成XML格式。
$xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:izn="http://example.com/service">
<soapenv:Header/>
<soapenv:Body>
<izn:doQuery>
<string>' . json_encode($params) . '</string>
</izn:doQuery>
</soapenv:Body>
</soapenv:Envelope>';
使用 wp_remote_post 函数发送数据到 SOAP 的主要代码
转换之后,我们需要把这个 XML 数据作为 HTTP 的 body 信息发送给 SOAP,同时需要设置一下 HTTP Header,说明我们需要传输的数据是 xml,并设置内容长度和超时时间。
$service_url = 'http://example.php/service';
$headers = [
'Content-Type' => 'text/xml',
'Content-Length' => strlen($xml),
'timeout' => 600,
];
$response = wp_remote_post($service_url, [
'headers' => $headers,
'body' => $xml,
]);
从SOAP获取的数据格式也是 XML 格式的,我们根据需要转换成 PHP 对象或数组来使用就可以了。
使用 PHP cURL 库获取 SOAP 数据
本质上,WordPress 的 wp_remote_post 函数是通过 PHP 的 cURL 库请求网络的,所以我们也可以直接使用 cURL 来请求 SOAP 接口获取数据。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $service_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1000);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); // the SOAP request
// converting
$response = curl_exec($ch);
curl_close($ch);
根据我们的经验,SOAP相对于REST API,使用起来相当麻烦,如果是构建自己的 API,建议优先使用 REST API,对节省不少时间。