利用PHP 与MediaWiki API 来获取信息
简介
常用缩略语
∙API:应用程序编程接口
∙CSRF:跨站点请求伪造
∙HTML:超文本标记语言
∙HTTP:超文本传输协议
∙IP:因特网协议
∙JSON:JavaScript 对象标记法
∙OOP:面向对象编程
∙PEAR:PHP 扩展与应用程序库
∙REST:具象状态传输
∙WDDX:Web 分布式数据交换
∙XHTML:可扩展超文本标记语言
∙XML:可扩展标记语言
phpjson格式化输出∙YAML:YAML Ain't 标记语言
很多人都知道:它是容纳各种来源知识的终极存储库,涵盖几乎每个您能想到的主题,通过Web 浏览器就可轻松获得。不论您想要查什么信息,都可在中到,并能获得详细的相关信息。而且,因为它是公开可编辑的,所以,其中经常会包含一些更新信息以及相关信息。
大部分人可能对的另一个侧面不太了解。那就是隐藏的幕后的,强大的Web 服务API,它使得开发人员能够进行访问、搜索、以及将内容集成到自定义Web 应用程序中。该API 通过HTTP 工作,并返回各种格式的数据(包括XML),对广大编程人员免费提供,它使得利用的强大数据库来创建各类自定义Web 应用程序成为可能。
在本文中,将对该API 进行简要介绍,展示如何利用PHP 编程语言来对其进行集成与使用。本文解释
了该API 的工作基础,然后为您介绍列出类目、通过类目或者关键字来搜索条目、检索并展示条目、以及远程增加和编辑内容等的相关实际例子。
回页首理解API
在开始研究PHP 代码之前,先要介绍一下Wikipedia API。首先,虽然本文中我将其称之为“Wikipedia API”,但需要特别注意,该API 不是Wikipedia 专用的。它实际上是MediaWiki(Wikipedia 的运行基础)的一部分,因此,本文中所列举的技术和API 方法还可用于任何其他基于MediaWiki 的wiki 中。参考资料中提供了MediaWiki 与完整MediaWiki API 参考手册的链接。
和所有基于HTTP 的服务一样,该API 通过接受HTTP 请求(其中包含一个或多个输入参数并返回可被请求客户端使用和解析的响应)来运行。大多数情况下,响应的格式是XML,因为当前几乎所有编程语言都能够解析XML;然而,也有可能需要返回其他格式的数据,比如JSON、WDDX、YAML、或者PHP 序列化的。
该API 的每一个HTTP 请求都必须包含一个“action” 参数,它指定请求的动作。该参数必须是一个查询、一个编辑或删除操作、一个认证请求、或者所支持的任何一个操作。除了这一强制参数外,基于所选择的
该方法会返回以前缀“hollywood” 开始的前10 个Wikipedia 类。清单1 举例说明针对该请求的原始XML 响应。
清单 1. 示例API 提要
<?xml version="1.0"?>
<api>
<query>
<allcategories>
<c size="31" pages="28" files="0" subcats="3"
xml:space="preserve">Hollywood</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood's Rock Walk inductees</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood, California</c>
<c size="1" pages="1" files="0" subcats="0"
xml:space="preserve">Hollywood, Florida</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood, Los Angeles, California</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood/celebrity/Wanda Shelley</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood Actors</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood Actress</c>
<c size="0" pages="0" files="0" subcats="0"
xml:space="preserve">Hollywood Blacklist</c>
<c size="2" pages="2" files="0" subcats="0"
xml:space="preserve">Hollywood Boulevard</c>
</allcategories>
</query>
<query-continue>
<allcategories acfrom="Hollywood Cemetery (Richmond)" />
</query-continue>
回页首列出类目和网页
理解了API 的工作方式后,我们来看一些代码。本文假定读者已经对HTML 和XML 很熟悉,并具有已经安装了最新版Zend Framework 的Apache/PHP 开发环境。还假定读者了解在PHP 中的类与对象的相关知识,因为文中所采用的PHP 组件是遵照OOP 原则来编写的。
要想与API 交互,就需要一个能够传输GET 和POST 请求,并能够处理响应的HTTP 客户端。Zend Framework's Zend_Rest_Client 就是个很有效的工具,它就是为那些想要将PHP 应用程序与Web 服务集成到一起的开发人员专门设计的。可利用该客户端来执行对服务端点的GET、POST、PUT、与DELETE 响应。XML 响应以Zend_Rest_Client_Response 对象实例的方式返回,这样就能更方便地访问单个响应属性。
清单 2 演示了检索与显示清单 1 中类目的流程,该例中的PHP 脚本上下文中采用了Zend_Rest_Client。
清单 2 首先初始化了Zend Framework 的自动加载程序,然后加载Zend_Rest_Client 组件。创建了Zend_Rest_Client 对象的一个实例,在初始化操作中确定Wikipedia API 服务端点作为构造函数参数。然后定义并添加请求参数,再使用客户端对象的get()方法来将请求传递给API。来自服务器的XML 响应会被自动接收,并被Zend_Rest_Client 转换为一组SimpleXML 对象,这样就可以利用标准对象属性标记来进行访问。
图 1 演示了清单 2 的输出结果。
图 1. 列出Wikipedia 类目的Web 页
注意通过使用Zend_Rest_Client 将请求参数传递给服务器的方式。通过调用相同名称的客户端以及将值作为第一个参数传递给该方法,来指定每个参数。例如,要向请求增加参数action=query,脚本会调用$client->action('query')。可在Zend_Rest_Client 文档中获得更多相关信息(见参考资料中的相关链接)。
您也可以通过将查询修改为返回类目成员清单而不是类目,来在类目中检索页面清单。很显然,需要将类目名作为输入来传递给API。考虑清单3,它就是用于完成此任务的。
清单 3. 列出类目中的页面
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
// define category
$cat = 'Greek_legendary_creatures';
try {
// initialize REST client
$wikipedia = new Zend_Rest_Client('/w/api.php');
// set query parameters
$wikipedia->action('query');
$wikipedia->list('categorymembers');
$wikipedia->cmtitle('Category:'.$cat);
$wikipedia->cmlimit('30');
$wikipedia->format('xml');
// perform request
/
/ iterate over XML result set
$result = $wikipedia->get();
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
>
<html>
<head></head>
<body>
<h2>Search results for pages in category
'<?php echo $cat; ?>'</h2>
<ol>
<?php foreach ($result->query->categorymembers->cm as $c): ?>
<li><a href="/wiki/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论