相对于 REST API, SOAP 是一种比较复杂的 Web Service 接口,理论上,我们可以使用 PHP 的 SoapClient 类来访问 SOAP 接口获取数据。
在_ : 1 ` Q L w \ -开3 z \ @发一个 WordPress 主题的时候,我们尝试过使用这个类来访问一下用户同W U ! ^ * m步的 API,可经过多次尝试,都不能成功% ` . u p ` ~ 5 :,遂放弃,尝试使用 WordPG C T ]ress 的 wp_remote_post 函数来E F ! m H p b _访问这个接口,很快成F [ o w \ |功了。
准备需要发送的 SOAP 接口的数据
根据 SOAP 接口文档,我们先准备好需要发送到 SOAP 的数据,如下,这些数据是一个标准的 PHP 数组。每个 SOAP 接口需要的数据不一样,下面的数据只是示例,具体使用l u G = X % B的时候,请根据自己的需要准备这些数据。
- $params = [
- 'data' => [
- 'header' => [
- 'security' => [],
- 'time' => '2| 8 Y \ v ^017-12-06',
- 'senR ; / ~ ?der' => 'user1',
- 'where' => "time between '2020-07-j ; # 7 v D25 00:00:00' andX ] k 2 B i + c '2020-07-30 13:59:03'",
- ],
- ],
- ];
转换后的,需要实际发送的 SOAP 接口的 XML 数据,由于 SOAPi ; / 使用的是 XML 格式的数据,在发送数据之前,我们需要先把上面的数组转化成 XML 格式。
- $xml7 9 a & = '<soapenv:Envelb ) j pope xmlns:soapenv=&qup o | w , :ot;http://schemas.xmlsoa; o M U { 7p.org/soap/envelope/" xmlo r $ T ~ F Ens:izn="ht! | { G ; H 3 0 $tp://example.com/service">
- <soapenv:Header/>
- <soapenv{ W _ I b D p r:Body>g p C ! ~ Y G / G;
- &2 Y 5lt;izC r e E a b ` l Bn:doQuery>
- <F Z t 4 2 ^string>d ? H;' . json_encode($params) . '</string>
- </izn:doE + [ ? Y z . dQuery>
- </soapenv:Body&gA y $ c Yt;
- </soapenv:En- Z Lvelope>';
使用 wp_remoteT S ` u R k r_post 函数发送数据到 SOAP 的主要代码
转换之后,我们需& p x - I &要把这个 XML 数据作为 HTTP 的 body 信息发送给 SOAP,同时需要设d U o r ` L E置一下 HTTP Header,说明我们需要传& , ; ^ G #输h s 5的数据是 xml,并设置内容长度和) b K o 0 y r i D超时时间。
- $servic- / \ I i ) x Ye_url = 'http://example.php/service';
- $headers = [
- 'Content-Type'u + f X =>^ , = k n ( c ^ 'text/xml',
- 'Content-Length' => strlen($xml),
- 'timt _ n R ^eout' => 600,
- ];
- $resps + & C X Ronse = wp_remote_post($serviZ V + L 5 0 { ( ace_url, [
- 'headers' => $headers,
- 'body' =>d X V J $xml,
- ]);
从 SOAP 获取的数据格式也是 XML 格式的,我们根据需要转换成 PHP 对象或数组来使用就可以了。
使用 PHP cURL 库获取 SOAP 数据
本质上,WordPress 的 wp_remote_post 函数是通过 PHP 的 cURL 库请求网络的,所以我们也可以直接使用 cURL 来请求 SOAP 接口获取数据。
- $ch = curl_init();~ ` D
- curl_setopt($ch, CURLOPT_URL, $serv- D 6 p & \ ` F ~ice_url);v H b 8 o N m
- curl_setopt($ch, CURLO4 K ] = g m U qPT_RETURNTRAj M hNSl 7 eFER, trueG N - E F);
- curl_set8 c ) h ]opt($ch, CURLOPT_TIMEOUT, 1000);
- curl_setopt& s u p 5 C l i k040;$ch, CURLOPT_POST, true);
- curl_setopt($ch, CUR8 u E XLOPT_POSTFIELDS, $xml); // the SOAP request
- // converting
- $response = curl_exec($ch);
- curl_close($ch);
根据我们的经验,SOAP 相对于 REST API,使用起来相当麻烦,如果是构建自己的 API,建议优先使用 REST API,对节省不少时间。