创建一个简单的SOAP客户端

与实现REST客户端或服务器的过程相比,使用SOAP是非常容易的,因为有一个PHP SOAP扩展提供了这两种功能。

{% hint style=”info” %} 一个经常被问到的问题是 “SOAP和REST之间有什么区别?” SOAP内部使用XML作为其数据格式。SOAP使用HTTP,但只用于传输,除此之外对其他HTTP方法无法进行识别。REST直接操作HTTP,可以使用任何数据格式,但首选JSON。另一个关键的区别是,SOAP可以与WSDL一起操作,这使得服务自我描述,从而更加公开。因此,SOAP服务通常由国家卫生组织等公共机构提供。 {% endhint %}

如何做…

在这个例子中,我们将对美国国家气象服务提供的现有SOAP服务进行SOAP请求。

1.首先要考虑的是识别WSDL文档。WSDL是描述服务的XML文档。

  1. $wsdl = 'http://graphical.weather.gov/xml/SOAP_server/'
  2. . 'ndfdXMLserver.php?wsdl';

2.接下来,我们使用 WSDL 创建一个 soap 客户端实例。

  1. $soap = new SoapClient($wsdl, array('trace' => TRUE));

3.然后,我们可以自由地初始化一些变量,以应对天气预报的请求。

  1. $units = 'm';
  2. $params = '';
  3. $numDays = 7;
  4. $weather = '';
  5. $format = '24 hourly';
  6. $startTime = new DateTime();
  1. 然后,我们可以发出LatLonListCityNames()SOAP请求,在WSDL中被标识为一个操作,以获取服务支持的城市列表。该请求以 XML 格式返回,建议创建一个 SimpleXLMElement 实例。
  1. $xml = new SimpleXMLElement($soap->LatLonListCityNames(1));
  1. 不幸的是,城市列表和它们对应的经纬度是在单独的XML节点中。因此,我们使用array_combine()PHP函数来创建一个关联数组,其中经纬度是键,城市名称是值。然后我们可以使用这个数组来呈现一个HTML SELECT下拉列表,使用asort()来对列表进行字母排序。
  1. $cityNames = explode('|', $xml->cityNameList);
  2. $latLonCity = explode(' ', $xml->latLonList);
  3. $cityLatLon = array_combine($latLonCity, $cityNames);
  4. asort($cityLatLon);
  1. 然后,我们可以从网络请求中获得城市数据,如下所示。
  1. $currentLatLon = (isset($_GET['city'])) ? strip_tags(urldecode($_GET['city'])) : '';

7.我们希望进行的 SOAP 调用是 NDFDgenByDay()。我们可以通过检查 WSDL 来确定提供给 SOAP 服务器的参数的性质。

  1. <message name="NDFDgenByDayRequest">
  2. <part name="latitude" type="xsd:decimal"/>
  3. <part name="longitude" type="xsd:decimal"/>
  4. <part name="startDate" type="xsd:date"/>
  5. <part name="numDays" type="xsd:integer"/>
  6. <part name="Unit" type="xsd:string"/>
  7. <part name="format" type="xsd:string"/>
  8. </message>
  1. 如果$currentLatLon的值被设置,我们就可以处理这个请求。我们用 try {} catch {} 块来处理请求,以防出现异常。
  1. if ($currentLatLon) {
  2. list($lat, $lon) = explode(',', $currentLatLon);
  3. try {
  4. $weather = $soap->NDFDgenByDay($lat,$lon,
  5. $startTime->format('Y-m-d'),$numDays,$unit,$format);
  6. } catch (Exception $e) {
  7. $weather .= PHP_EOL;
  8. $weather .= 'Latitude: ' . $lat . ' | Longitude: ' . $lon;
  9. $weather .= 'ERROR' . PHP_EOL;
  10. $weather .= $e->getMessage() . PHP_EOL;
  11. $weather .= $soap->__getLastResponse() . PHP_EOL;
  12. }
  13. }
  14. ?>

如何运行…

将前面所有的代码复制到chap_07_simple_soap_client_weather_service.php文件中。然后你可以添加视图逻辑来显示城市列表的表单以及结果。

  1. <form method="get" name="forecast">
  2. <br> City List:
  3. <select name="city">
  4. <?php foreach ($cityLatLon as $latLon => $city) : ?>
  5. <?php $select = ($currentLatLon == $latLon) ? ' selected' : ''; ?>
  6. <option value="<?= urlencode($latLon) ?>" <?= $select ?>>
  7. <?= $city ?></option>
  8. <?php endforeach; ?>
  9. </select>
  10. <br><input type="submit" value="OK"></td>
  11. </form>
  12. <pre>
  13. <?php var_dump($weather); ?>
  14. </pre>

这是在浏览器中请求俄亥俄州克利夫兰市天气预报的结果。

创建一个简单的SOAP客户端 - 图1

参考

关于SOAP和REST之间的区别,请参考http://stackoverflow.com/questions/209905/representational-state-transfer-rest-and-simple-object-access-protocol-soap?lq=1