级别: 中级 Vikram Vaswani, 创始人, Melonfire
2008 年 2 月 04 日 del.icio.us 服务允许用户在线收集和分享书签。利用与 del.icio.us 的 REST API 接口交互的 PEAR Services_Delicious 包操纵书签并构建定制的 PHP 应用程序。
简介
如果经常上网冲浪,很可能已经知道 del.icio.us 是什么了:对感兴趣的网站添加书签并和其他用户分享的一种免费在线服务。该服务还允许用户用关键字 “标记” 书签,随时查看最受欢迎的书签。
del.icio.us 最棒的特性之一是能够通过基于 REST 的 API 访问书签列表,并把这个列表结合到您自己的支持 XML 的应用程序中。多数情况下,需要编写应用程序级的代码与 del.icio.us REST API 通信、发送请求和解析响应。但如果是 PHP 应用程序,使用 Services_Delicious 可以节省不少工作,这个包来自 PHP 扩展和应用程序资料库(PHP Extension and Application Repository,PEAR)。
Services_Delicious 包提供了和 del.icio.us REST API 通信、创建和传输请求、解析和解码 XML 响应的 API。因而提供了一种从 PHP 应用程序查看、添加、编辑或删除 del.icio.us 书签的健壮而易用的小部件。本文简要介绍了该包,并通过代码示例说明如何完成上述这些基本任务。
安装
Services_Delicious 包由 Stephan Schmidt 和 Tatsuya Tsuruoka 维护,以 PHP 许可发布在 PHP 社区。最简单的安装办法是用自动化的 PEAR 安装程序,应该包含在默认的 PHP 安装包中。安装只需在 shell 提示符下输入下列命令:
shell> pear install Services_Delicious
PEAR 安装程序连接到 PEAR 包服务器并下载程序包,然后安装到系统的适当位置。本文使用了 Services_Delicious V0.5.0。
如果手工安装,可以访问主页并下源代码压缩包,然后手工解压到指定位置。需要注意的是手工安装必须对 PEAR 程序包的组织结构有所了解。
Services_Delicious 依赖另外两个 PEAR 包:HTTP_Request 和 XML_Serializer。可以使用 PEAR 自动安装程序按照前面的说明安装这些包,本文 参考资料 部分提供了有关的链接。值得注意的是,在开发过程中我发现 HTTP_Request 包有时候在 Windows® 上不能正确运行,因此本文假设使用 *NIX 开发环境。
Services_Delicious 还需要在 PHP 开发环境中安装 PHP OpenSSL 和 OpenSSL
扩展。在 *NIX 环境下,可能需要在这些扩展的支持下重新编译 PHP。OpenSSL 网站的链接以及激活 PHP OpenSSL 扩展的详细信息请参阅 参考资料。
最后,本文中的例子假设您已经拥有
del.icio.us 的帐号,也许还添加了几个书签。否则应该签署服务协议 — 免费的 — 并在账户中输入必要的信息。可以在本文的 参考资料 小节找到签署服务的链接。
检索书签
讨论 Services_Delicious 之前,关于 del.icio.us API 首先说几句。和所有的基于 REST 的服务一样,这种 API 也通过 HTTP 工作,授权访问之前使用 HTTP Basic 身份验证检查用户凭证。其中包括添加和删除书签、检索用户书签列表和检索(或者重命名)用户标记的方法。
要了解这种 API 的工作情况,请在任何浏览器中访问 URL https://api.del.icio.us/v1/posts/recent。该 REST 方法将返回用户最近提交的列表。可能要求您输入 del.icio.us 用户凭证,然后就能看到该方法的原始 XML 响应,其中包含最新的书签列表。结果应该类似于 清单 1:
清单 1. 来自 del.icio.us 的 XML 响应包
<?xml version='1.0' standalone='yes'?>
<posts tag="" user="someuser">
<post href="http://www.kernel.org/" description="The Linux Kernel Archives"
hash="7dae6d24e3f8c6c3c3aa1b05ce5bfe94" tag="linux kernel opensource"
time="2007-12-04T09:03:25Z" />
<post href="http://www.everythingphpmysql.com/" description="How to
do Everything with PHP & MySQL - Vikram Vaswani"
hash="8c9c6572c70cb3de3fa93b87269a8d79"
tag="book development php mysql web beginner" time="2007-12-04T09:02:47Z" />
<post href="http://www.mysql-tcr.com/" description="MySQL: The Complete
Reference - Vikram Vaswani" hash="c8d99b00cfb9a1af9d59bbc6c46848cd"
tag="mysql php book" time="2007-12-04T09:02:21Z" />
...
</posts>
|
图 1 显示了 Mozilla Firefox 中的输出:
图 1. 在 Mozilla Firefox 中显示的 del.icio.us 的 XML 响应包
清单 2 示范了如何利用 Services_Delicious 在 PHP 应用程序中完成同样的动作:
清单 2. 检索书签
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get recent posts from del.icio.us
print_r($sdObj->getRecentPosts());
?>
|
记住要用实际的值替换该清单及后面其他清单中的用户名和密码。
清单 2 利用 PHP Services_Delicious 包链接到 del.icio.us Web 服务和检索最新提交的列表。首先读入 Services_Delicious 类文件并初始化 Services_Delicious 类对象的一个实例。将用户的 del.icio.us 用户名和密码传递给对象构造函数来完成 HTTP 身份验证。然后对象的 getRecentPosts() 方法检索用户最近提交的书签,解析 XML 响应并转化成嵌套的 PHP 数组序列。
清单 3 显示了 getRecentPosts() 返回的数组:
清单 3. 包含检索得到的书签的 PHP 数组
Array
(
[0] => Array
(
[href] => http://www.kernel.org/
[description] => The Linux Kernel Archives
[hash] => 7dae6d24e3f8c6c3c3aa1b05ce5bfe94
[tag] => Array
(
[0] => linux
[1] => kernel
[2] => opensource
)
[time] => 2007-12-04T09:03:25Z
)
[1] => Array
(
[href] => http://www.everythingphpmysql.com/
...
)
)
|
利用 PHP foreach() 循环很容易改变数组的格式以便用 HTML 显示出来。清单 4 示范了该过程:
清单 4. 将检索的书签格式化为 HTML 页面
<html>
<head></head>
<body>
<h2>My Bookmarks</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get recent posts from del.icio.us
// print as bulleted list
$posts = $sdObj->getRecentPosts();
echo "<ul>\n";
foreach ($posts as $p) {
echo " <li>\n";
echo " <a href=\"" . $p['href'] . "\">" . $p['description'] . "</a><br />\n";
echo " <span style=\"color:red\">" . implode(' ', $p['tag']) . "</span>\n";
echo " </li>\n";
}
echo "</ul>\n";
?>
</body>
</html>
|
清单 4 迭代 getRecentPosts() 返回的数组,将每个元素作为无序列表项输出,相应的标记列在项的下面。结果如 图 2 所示:
图 2. 显示从 del.icio.us 检索的书签的 HTML 文档
处理标记
getTags() 方法返回 del.icio.us 帐户使用的所有标记以及使用的次数。清单 5 说明了该方法的用法:
清单 5. 检索用户标记
<html>
<head></head>
<body>
<h2>My Tags</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get tags from del.icio.us
// print as table
$tags = $sdObj->getTags();
echo "<table border=\"1\">\n";
foreach ($tags as $tag => $count) {
echo " <tr>\n";
echo " <td>$tag</td>\n";
echo " <td>$count</td>\n";
echo " </tr>\n";
}
echo "</table>\n";
?>
</body>
</html>
|
结果如 图 3 所示:
图 3. 显示 del.icio.us 检索的标记的 HTML 文档
得到标记列表后,使用 getPosts()
方法可返回和一个或多个标记匹配的书签列表,只需要在第一个参数中传递标记名称数组。清单 6 返回了用关键字 book 标记的书签:
清单 6. 按标记筛选书签
<html>
<head></head>
<body>
<h2>My Bookmarks</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get recent posts from del.icio.us
// tagged with 'book'
// print as bulleted list
$posts = $sdObj->getPosts(array('book'));
echo "<ul>\n";
foreach ($posts as $p) {
echo " <li>\n";
echo " <a href=\"" . $p['href'] . "\">" . $p['description'] . "</a><br />\n";
echo " <span style=\"color:red\">" . implode(' ', $p['tag']) . "</span>\n";
echo " </li>\n";
}
echo "</ul>\n";
?>
</body>
</html>
|
偶尔也可以向 getRecentPosts() 传递类似的标记名数组作为第一个参数。
添加和删除书签
Services_Delicious 也可在 PHP 应用程序中添加和删除 del.icio.us
帐户的书签,需要使用 addPost() 和 deletePost() 方法。清单 7 增加了一个新书签:
清单 7. 增加书签
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// add a bookmark to del.icio.us
$ret = $sdObj->addPost('http://www.google.com/', 'My fav search engine',
null, 'search web cool', null, null);
if ($ret === true) {
echo 'Bookmark added.';
} else {
echo 'Bookmark could not be added.';
}
?>
|
addPost() 方法有六个参数,只有前两个是必需的。按照出现顺序,这些参数分别是:
- URL
- URL 链接的描述
- URL 链接的详细描述
- 链接标记
- 提交 URL 的日期和时间
- 该项是否为私有
addPost() 返回一个 Boolean 值,从而很容易检查是否成功提交了项并向用户显示适当的信息。
如果需要删除不再感兴趣的书签,清单 8 给出了一个例子:
清单 8. 删除书签
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// remove a bookmark from del.icio.us
$ret = $sdObj->deletePost('http://www.google.com/');
if ($ret === true) {
echo 'Bookmark removed.';
} else {
echo 'Bookmark could not be removed.';
}
?>
|
删除书签比增加书签更简单:只需要向 deletePost() 提供一个 URL,就大功告成了!
一个简单的应用程序
我们已经了解了 Services_Delicious 可以做什么,能不能举一个比较实用的例子呢?清单 9 示范了一个基于 PHP 的 del.icio.us 书签管理器,它利用前面所述的方法以交互的方式查看和添加书签:
清单 9. 交互式书签管理器
<html>
<head></head>
<body>
<h2>My Bookmarks</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// use form submission
// to add new bookmark
if (isset($_POST['submit'])) {
$url = trim($_POST['url']);
$desc = trim($_POST['desc']);
$tags = trim($_POST['tags']);
$sdObj = new Services_Delicious('someuser', 'somepass');
$ret = $sdObj->addPost($url, $desc, null, $tags, null, null);
if ($ret === true) {
echo 'Bookmark saved!';
} else {
echo 'Bookmark not saved!';
}
unset($sdObj);
}
// get recent posts from del.icio.us
// print as bulleted list
$sdObj = new Services_Delicious('someuser', 'somepass');
$posts = $sdObj->getRecentPosts();
echo "<ul>\n";
foreach ($posts as $p) {
echo "<li>\n";
echo "<a href=\"" . $p['href'] . "\">" . $p['description'] . "</a><br />\n";
echo "<span style=\"color:red\">" . implode(' ', $p['tag']) . "</span>\n";
echo "</li>\n";
}
echo "</ul>\n";
?>
<h2>Add New Bookmark</h2>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
URL *: <br /> <input type="text" name="url" size="30" /> <br />
Description *: <br /> <input type="text" name="desc" size="30" /> <br />
Tags: <br /> <input type="text" name="tags" size="30" /> <br />
<input type="submit" name="submit" value="Save" />
</form>
</body>
</html>
|
清单 9 使用了前面讲过的两个方法:
-
getRecentPosts() 方法,列出最新添加的书签
-
addPost() 方法,从提交的表单接收数据并相应地更新书签列表
图 4 显示了应用程序的主页:
图 4. 添加新的 del.icio.us 书签的 HTML 表单
图 5 显示了添加新书签后更新了的主页:
图 5. 添加书签之后的 del.icio.us 新书签列表
通过这些例子表明,Services_Delicious 包为 del.icio.us REST API 提供了一种干净的 PHP 包装器。如果需要将 del.icio.us 数据与其他 Web 服务的数据结合起来,或者为 del.icio.us 建立自定义界面,这是一种非常有用的工具。试一试吧,看看能做什么!
参考资料 学习
获得产品和技术
-
Services_Delicious 包:下载这种基于 REST 的 del.icio.us Web 服务的客户机,轻松添加、删除、分类和共享站点集合。
-
XML_Serializer 包:下载该类,并生成不需要 DOM 的 XML 文档。
-
HTTP_Request 包:下载这种工具,实现 GET/POST/HEAD/TRACE/PUT/DELETE、基本身份验证、代理、代理身份验证、SSL 和文件上传。
-
OpenSSL 包:下载这个实现了 Secure Sockets Layer (SSL v2/v3) 和 Transport Layer Security (TLS v1) 协议的工具箱,其中包括一个通用加密库。
-
IBM 试用版软件:用这些试用软件开发您的下一个项目,可直接从 developerWorks 下载。
讨论
关于作者
对本文的评价
|