快捷搜索:   服务器  PHP  安全  IIS  linux 安全

将 Google Book Search 集成到 PHP 应用程序中

简介

如果您与出版业有某种联系,或者即使您只是一位热心读者,您也可能听说过 Google Books。Google Books 是 Google 致力于创建世的可搜索数字图书馆的尝试,其方法是扫描数百万本图书并使它们可以在线预览和购买。这也是 Google 最有争议的项目之一,是最近的 2009 年 11 月才结案的一个集体诉讼的焦点。

除了作为一个有趣的闲聊话题外,从开发人员角度看,Google Books 因具有 Data API 而变得有趣。该 API 允许开发人员阅读和搜索 Google Books 数据库,寻找匹配用户指定标准的图书,并在其他 Web 应用程序中使用这些搜索结果。您可以通过任何支持 XML 的开发工具包来访问这个遵循 REST 模型的 API。该 API 已经拥有针对 PHP、Java™ 和其他常用编程语言的客户端库。

本文将向您介绍 Google Book Search Data API,展示如何在自定义 PHP 应用程序中使用并集成图书搜索结果。本文包含了一些示例,展示如何通过关键字、语言和作者搜索图书,检索图书数据(包括 ISBN 编号和缩略图),对数据库中现有的图书添加评论和评分。来吧,我们现在就开始!

了解 Book Search 提要

在开始 PHP 代码之前,需要先介绍一下 Google Book Search Data API。与其它基于 REST 的服务一样,该 API 接受包含一个或多个 XML 编码输入参数的 HTTP 请求,并返回可以在任何具有 XML 意识的客户机中解析的 XML 编码响应。对于 Google Book Search Data API,响应总是包含一个 Atom 提要,它包含请求的信息。

一个典型的 Book Search 提要包含的信息足够构建一个有用且相关的应用程序。眼见为实,尝试在您喜爱的 Web 浏览器中访问这个 URL:http://books.google.com/books/feeds/volumes?q=php。该 REST 方法返回一个匹配关键字 php 的图书列表。该方法的原始 XML 响应(可以在生成的页面的源代码中查看)包含关于这些图书的详细信息,看起来可能类似于 清单 1:

清单 1. 一个示例 Google Book Search 提要

<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
 xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'
 xmlns:gbs='http://schemas.google.com/books/2008'
 xmlns:dc='http://purl.org/dc/terms'
 xmlns:gd='http://schemas.google.com/g/2005'>
  <id>http://www.google.com/books/feeds/volumes</id>
  <updated>2009-12-28T06:14:28.000Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
   term='http://schemas.google.com/books/2008#volume'/>
  <title type='text'>Search results for php</title>
  <link rel='alternate' type='text/html' href='http://www.google.com'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
   href='http://www.google.com/books/feeds/volumes'/>
  <link rel='self' type='application/atom+xml'
   href='http://www.google.com/books/feeds/volumes?q=php'/>
  <link rel='next' type='application/atom+xml'
   href='http://www.google.com/books/feeds/volumes?q=php
   &start-index=11&max-results=10'/>
  <author>
    <name>Google Books Search</name>
    <uri>http://www.google.com</uri>
  </author>
  <generator version='beta'>Google Book Search data API</generator>
  <openSearch:totalResults>277</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>10</openSearch:itemsPerPage>
  <entry>
    <id>http://www.google.com/books/feeds/volumes/tywvv3ULal0C</id>
    <updated>2009-12-28T06:14:28.000Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind'
      term='http://schemas.google.com/books/2008#volume'/>
    <title type='text'>Programming PHP</title>
    <link rel='http://schemas.google.com/books/2008/thumbnail'
      type='image/x-unknown' href='http://bks8.books.google.com/books?
      id=tywvv3ULal0C&printsec=frontcover&img=1&zoom=5
      &edge=curl&sig=ACfU3U0WFIZOyvLPjIv7jqlX4XZ7GI4TAg
      &source=gbs_gdata'/>
    <link rel='http://schemas.google.com/books/2008/info' type='text/html'
     href='http://books.google.com/books?id=tywvv3ULal0C&dq=php
     &ie=ISO-8859-1&source=gbs_gdata'/>
    <link rel='http://schemas.google.com/books/2008/preview' type='text/html'
     href='http://books.google.com/books?id=tywvv3ULal0C
     &printsec=frontcover&dq=php&ie=ISO-8859-1&cd=1
     &source=gbs_gdata'/>
    <link rel='http://schemas.google.com/books/2008/annotation'
     type='application/atom+xml'
     href='http://www.google.com/books/feeds/users/me/volumes'/>
    <link rel='alternate' type='text/html'
     href='http://books.google.com/books?
     id=tywvv3ULal0C&dq=php&ie=ISO-8859-1'/>
    <link rel='self' type='application/atom+xml'
     href='http://www.google.com/books/feeds/volumes/tywvv3ULal0C'/>
    <gbs:embeddability value='http://schemas.google.com/books/2008#embeddable'/>
    <gbs:openAccess value='http://schemas.google.com/books/2008#disabled'/>
    <gbs:viewability value='http://schemas.google.com/books/2008#view_partial'/>
    <dc:creator>Rasmus Lerdorf</dc:creator>
    <dc:creator>Kevin Tatroe</dc:creator>
    <dc:creator>Peter MacIntyre</dc:creator>
    <dc:date>2006</dc:date>
    <dc:description>With style tips and practical programming advice,
     this book will help you become not just a PHP programmer,
     but a &quot;good&quot; PHP programmer.</dc:description>
    <dc:format>521 pages</dc:format>
    <dc:format>book</dc:format>
    <dc:identifier>tywvv3ULal0C</dc:identifier>
    <dc:identifier>ISBN:0596006810</dc:identifier>
    <dc:identifier>ISBN:9780596006815</dc:identifier>
    <dc:publisher>O'Reilly Media, Inc.</dc:publisher>
    <dc:subject>Computers</dc:subject>
    <dc:title>Programming PHP</dc:title>
  </entry>
  <entry>
  ...
  </entry>
</feed>

 快速浏览该输出以熟悉其主要元素:

•Google Book Search Data API 通过一个包含请求数据的 Atom 提要来响应 REST 请求。在多数情况下,最外边的 <feed> 元素包含一些 <link> 元素,这些元素又包含结果集的当前页面、下一个页面和上一个页面的 URL;一些 <openSearch:> 元素,这些元素包含该搜索的摘要统计。

•最外边的 <feed> 元素包含一个或多个 <entry> 元素,每个元素表示匹配搜索查询的一本书或 “卷”。每个<entry> 包含关于它表示的图书的其他信息,包括标题、说明、出版日期、作者和出版商。每个 <entry> 还包含一些 <link> 元素,这些元素提供的 URL 链接可链接到详细的图书信息、缩略图、预览(如果有)以及评论和评分等注释。

•每个 entry 中带有名称空间的 <dc:> 元素都包含特殊的注释。这些元素对应于来自 Dublin Core Metadata Initiative (DCMI) 的元素,DCMI 为简单的信息标记和访问提供一组可重用的标准定义。如 清单 1 所示,这些元素包含关于每本图书的标题、作者、出版商、格式、主题和 ISBN 标识符的信息。
并非所有的 Google Book Search Data API 函数都可以以这种方式公开访问。尽管您无需验证就可以访问搜索函数,但仅当您是一位能够提供有效 Google Accounts 用户名和密码的验证用户,才能访问其他修改数据的函数(包括用于添加评论和标签,或向用户图书馆添加图书的函数)。本文将展示这两种类型的函数示例。

执行 Book Search 查询

现在您已经知道了如何通过公共 REST API 访问 Google Book Search 结果,下面将介绍如何从 PHP 应用程序内部完成相同的任务。显然,一种方法是使用 PHP 的内置 XML 处理扩展(SimpleXML、DOM 或 XMLReader)来解析由 Google Book Search 返回的 XML 提要并从中提取相关的信息片段。但是,这不是很方便,尤其是当您处理具有名称空间的信息的大型提要或大型卷册时。因此,本文将使用一种完全不同的方法:Zend Framework 的 Zend_Gdata 客户端库,这个库是专门为试图集成 PHP 应用程序和 Google Data APIs 的开发人员设计的。

Zend_Gdata 库可以作为 Zend Framework 的一部分下载,也可以作为一个独立包单独下载(参见 参考资料 部分的链接)。该库包含一个专门用于处理 Google Book Search Data API 的模块,提供预定义的类和方法来简化数据访问和验证。该库不仅为您的应用程序提供一个经过社区测试的坚实的代码基,而且,当您使用它时,您可以专注于核心应用程序函数,而不是导航 XML 树或处理自定义名称空间的具体细节。

清单 2 展示如何使用 Zend_Gdata 客户端库来检索和解析通过 Google Book Search Data API 检索的图书搜索结果的一个提要:

清单 2. 使用 Zend_Gdata 库检索搜索结果

<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Books');
Zend_Loader::loadClass('Zend_Gdata_Books_VolumeQuery');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "[email protected]";
$pass = "secret";

try {
// perform login
$client = Zend_Gdata_ClientLogin::getHttpClient(
$user, $pass, 'print');
$client->setHeaders('X-Forwarded-For', $_SERVER['REMOTE_ADDR']);
$books = new Zend_Gdata_Books($client);

// prepare and execute search query
$query = new Zend_Gdata_Books_VolumeQuery;
$query->setQuery(urlencode('robert crais'));
$feed = $books->getVolumeFeed($query);
} catch (Exception $e) {
die('ERROR:' . $e->getMessage());
}
?>

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching for book titles</title>
</head>
<body>

<h2><?php echo $feed->title; ?></h2>
<div>
<?php echo $feed->totalResults; ?> result(s) found.
</div>

<div id="results")
<ol>
<?php foreach ($feed as $entry): ?>
<li>
<?php echo $entry->getTitle(); ?>
</li>
<?php endforeach; ?>
</ol>
</div>

</body>
</html>

清单 2 首先加载 Zend 类库,然后初始化 Zend_Http_Client 类的一个实例。该客户端由一些用户凭证提供,这些用户凭证是创建到 Google Book Search 服务的验证连接所需要的。创建验证连接后,Zend_Gdata_Books 类的新实例被初始化;这个类充当与 Google Book Search Data API 的所有后续交互的控制点。

您最有可能使用的 Zend_Gdata_Books 方法是 getVolumeFeed() 方法,该方法返回匹配搜索查询的图书标题的提要。该方法通过一个已配置 Zend_Gdata_Books_VolumeQuery 类的实例传递,查询字符串通过 setQuery() 类方法设置。对 getVolumeFeed() 方法的响应是一个类似于 清单 1 中显示的 Atom 提要,该提要将自动解析并转换为一个 Zend_Gdata_Books_VolumeEntry 对象数组,每个对象表示提要中的一个 <entry>。现在,您可以轻松迭代这个数组,使用对象属性检索每个条目的细节,并将其转换为 HTML 页面。

图 1 展示了您可能看到的输出 — 匹配关键字 “robert crais” 的所有图书列表:

图 1. 一个简单 Google Books API 搜索的结果

有了上述基本理解之后,您可以很轻松地修改 清单 2 使其更具交互性。清单 3 添加了一个搜索表单,该表单可用于执行一个用户提供的图书搜索查询:

清单 3. 检索与用户所提供关键字匹配的搜索结果

<?php
if (isset($_POST['submit'])) {
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Books');
Zend_Loader::loadClass('Zend_Gdata_Books_VolumeQuery');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "[email protected]";
$pass = "secret";

try {
// perform login
$client = Zend_Gdata_ClientLogin::getHttpClient(
$user, $pass, 'print');
$client->setHeaders('X-Forwarded-For', $_SERVER['REMOTE_ADDR']);
$books = new Zend_Gdata_Books($client);

// prepare and execute search query
$query = new Zend_Gdata_Books_VolumeQuery;
$query->setQuery(urlencode($_POST['q']));
$feed = $books->getVolumeFeed($query);
} catch (Exception $e) {
die('ERROR:' . $e->getMessage());
}
}
?>

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching for book titles</title>
</head>
<body>
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论

  • ^