好哇网

在 WordPress 中使用 wp_remote_post 调用SOAP接口的数据

作者 wp_remote_post 2021-07-13 476

相对于REST API, SOAP 是一种比较复杂的 Web Service 接口,理论上,我们可以使用 PHP 的SoapClient 类来访问 SOAP 接口获取数据。

在开发一个WordPress主题的时候,我们尝试过使用这个类来访问一下用户同步的 API,可经过多次尝试,都不能成功,遂放弃,尝试使用 WordPress 的 wp_remote_post 函数来访问这个接口,很快成功了。

准备需要发送的SOAP接口的数据

根据SOAP接口文档,我们先准备好需要发送到SOAP的数据,如下,这些数据是一个标准的PHP数组。每个SOAP接口需要的数据不一样,下面的数据只是示例,具体使用的时候,请根据自己的需要准备这些数据。

1
2
3
4
5
6
7
8
9
10
$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格式。

1
2
3
4
5
6
7
8
$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,并设置内容长度和超时时间。

1
2
3
4
5
6
7
8
9
10
11
12
$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 接口获取数据。

1
2
3
4
5
6
7
8
9
10
$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,对节省不少时间。

发表评论

好哇网,每天提供1000+次下载,做你身边靠谱的下载站!

立刻探索下载

留言咨询