创建用于消费 Web 服务的模块
提到 Web 服务的话题可能会让许多开发者感到兴奋,但如果我们想消费其结果,我们应该如何简单地实现呢?我是否可以用我有限的经验或知识来利用这些信息?答案是肯定的,让我们看看如何实现。
提到 Web 服务的话题可能会让许多开发者感到兴奋,但如果我们想消费其结果,我们应该如何简单地实现呢?我是否可以用我有限的经验或知识来利用这些信息?答案是肯定的,让我们看看如何实现。
关于不同技术和相关术语的文档很多,这些术语并不陌生(已有超过 10 年的历史,这在技术领域来说已经很久了),因此,在本文中,我将仅关注其中之一,以展示使用这项技术是多么简单。
对于本文,我将以下列情况为例,“我希望打印危地马拉国家货币格查尔(Quetzal)对美元的汇率”。这一信息由危地马拉银行生成,并每天更新(http://www.banguat.gob.gt/cambio/)。并不荒谬地认为,某些应用程序依赖于人工登录银行网站并手动输入系统信息。让我们迈出自动化这一步骤的第一步,让我们在我们的网站上展示最新的信息。
为了在网站上展示信息,我们创建一个简单的模块,为此,我参考了项目的官方文档。https://docs.joomla.org/J3.x:Creating_a_simple_module/Developing_a_Basic_Module/es
按照官方文档的顺序
文件 mod_TCbanguat.php,实际上它并没有做很多事情,只是调用模块的 helper 并特别调用 getTC 函数,该函数将使用 Web 服务
<?php
/**
* 汇率 - 危地马拉银行
*
* @link http://www.adlcweb.com
* @license GNU/GPL,请参阅 LICENSE.php
* mod_TCbanguat 是免费软件。
* 根据 GNU 通用公共许可证进行分发,并作为分发的一部分包括或
* 是根据 GNU 通用公共许可证或其他免费或开源软件许可证授权的作品的派生作品。
*
*/
// 禁止直接访问
defined('_JEXEC') or die;
// 只包含一次联盟函数
require_once dirname(__FILE__) . '/helper.php';
$hello = modTCBanguatHelper::getTC($params);
require JModuleHelper::getLayoutPath('mod_TCbanguat');
?>
helper.php 文件仅包含一个函数,但可以添加所需的任何函数。让我们更详细地看看这里需要包含的内容。
<?php
/**
* @link http://www.adlcweb.com
* @license GNU/GPL,请参阅 LICENSE.php
* mod_TCbanguat 是免费软件。
* 根据 GNU 通用公共许可证进行分发,并作为分发的一部分包括或
* 是根据 GNU 通用公共许可证或其他免费或开源软件许可证授权的作品的派生作品。
*
*/
class ModTCBanguatHelper
{
/**
*
* @param array $params 包含模块参数的对象
*
* @access public
*/
function getTC( $params )
{
$url = 'http://www.banguat.gob.gt/variables/ws/TipoCambio.asmx?WSDL';
try {
$soap = new SoapClient($url);
$data = $soap->TipoCambioDia();
}
catch(Exception $e)
{
die($e->getMessage());
}
return $data->TipoCambioDiaResult->CambioDolar->VarDolar->referencia;
}
}
作为第一步,我们需要了解 Web Service 的 WSDL,那是什么?它是一个类似于 XML 的文件,其中描述了 Web Service (https://es.wikipedia.org/wiki/WSDL),基本上我们可以查看其函数、变量等,一开始可能看起来很复杂,但在弄清楚之前,我们通常可以访问一个对我们来说更容易理解的界面 (http://www.banguat.gob.gt/variables/ws/TipoCambio.asmx),在那里我们可以清楚地看到 Web Service 的函数及其特性。由于这是一个例子,我将使用这些中的第一个,它返回今天的汇率。
在 try & catch 块中,我们通过安全地创建 SOAP 对象(处理异常 https://php.ac.cn/manual/es/language.exceptions.php)并将执行所需函数的结果存储在变量 $data 中来执行操作。我们感兴趣的函数名为 TipoCambioDia,因为它出现在 SOAPAction 中。
如果我们比较两个可用的函数,我们可以看到选定的函数不处理输入参数。
我们 helper.php 中的最后一行是我们所需变量值的返回。信息所在的变量叫什么名字?让我们看看函数提供的信息,特别是以下片段:
很容易观察到,它具有类似于 XML 或 HTML 的标签结构,并且每个标签都是必要的,以便到达我们想要的具体数据(在这种情况下,日期或引用)。
有了前面的解释,我们的模块已经有了所需的信息,现在只需要显示它。为此,我们求助于模块的模板(default.php 文件)。
<?php
// 禁止直接访问
defined('_JEXEC') or die; ?>
<?php echo $hello; ?>
谁是hello?这是位于mod_TCbanguat文件中的变量,它调用了辅助函数,因此拥有我们刚刚审查的返回结果。目前它是一个没有吸引力的文件,没有任何细节,但已经包含了我们可以控制和以所需方式显示的信息。可以在变量前后添加任何文本,甚至可以考虑添加更多变量,例如可以从同一Web Service获取的日期,或者考虑让我们的小型模块准备好接受覆盖(使用HTML进行格式化)或翻译,但这些是超出展示如何简单消费Web Service数据的细节。
接下来,我们需要创建XML文件,以便Joomla安装程序可以识别,并允许我们发布我们的模块。
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1.0" client="site" method="upgrade">
<name>Banguat每日汇率类型</name>
<author>Leonel Canton</author>
<version>2.0.0</version>
<creationDate>2016年11月</creationDate>
<description>消费危地马拉银行的Web Service,并显示每日汇率。 http://www.banguat.gob.gt/variables/ws/TipoCambio.asmx?WSDL 现在正在使用php自带的SOAP库。已在Joomla! 3.6.4上测试过。</description> <files>
<filename>mod_TCbanguat.xml</filename>
<filename module="mod_TCBanguat">mod_TCbanguat.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
<filename>tmpl/index.html</filename>
</files>
<config>
</config>
</extension>
在所有文件准备就绪并调整到所需的Web Service后,我们需要进入Joomla!管理员界面,在扩展菜单中使用发现选项,选择我们的扩展并点击安装按钮。
最后,我们需要从管理员创建模块并在所需位置发布。
最终结果可以在我们的网站上看到与银行相同的汇率。
参考
http://www.service-architecture.com/articles/web-services/web_services_explained.html
https://w3schools.org.cn/xml/xml_services.asp
https://es.wikipedia.org/wiki/Servicio_web
https://php.ac.cn/manual/es/refs.webservice.php
https://volunteers.joomla.org/teams/web-services-working-group
示例
http://www.banguat.gob.gt/variables/ws/TipoCambio.asmx
http://www.webservicex.net/globalweather.asmx
https://w3schools.org.cn/xml/tempconvert.asmx
发表在Joomla社区杂志上的某些文章代表了作者对特定主题的个人观点或经验,可能不符合Joomla项目的官方立场。
接受后,您将访问由 https://magazine.joomla.net.cn/ 外部的第三方提供的服务
评论