Google Books API仅返回10个结果

时间:2012-07-07 12:56:18

标签: php xml api google-books

我正在实施一个PHP应用程序,它首次需要来自Google Books API的一些数据。 这很尴尬,但是当我使用典型的查询时   http://books.google.com/books/feeds/volumes?q=search+term(以前有过特定API经验的人,可以理解我),它只返回10个结果。

例如,http://books.google.com/books/feeds/volumes?q=php的XML响应包含以下字段:totalResults> 582。但是,我只检索了10个。

在阅读相应的文档后,我还没有得出解决方案。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:9)

现在,关键字是maxResults而不是max-results,就像raina77ow的回答一样。 Source。正如文档所述,一次可以检索的最大书籍数量为40.但是,您可以通过多个请求克服此限制,例如使用此PHP函数:

private $books = array('items' => array());

/**
 * Searches the Google Books database through their public API
 * and returns the result. Notice that this function will (due to
 * Google's restriction) perform one request per 40 books.
 * If there aren't as many books as requested, those found will be
 * returned. If no books at all is found, false will be returned.
 * 
 * @author Dakniel
 * @param string $query Search-query, API documentation
 * @param int $numBooksToGet Amount of results wanted
 * @param int [optional] $startIndex Which index to start searching from
 * @return False if no book is found, otherwise the books
 */
private function getBooks($query, $numBooksToGet, $startIndex = 0) {

    // If we've already fetched all the books needed, or
    // all results are already stored
    if(count($this->books['items']) >= $numBooksToGet)
        return $this->books;

    $booksNeeded = $numBooksToGet - count($this->books['items']);

    // Max books / fetch = 40, this is therefore our limit
    if($booksNeeded > 40)
        $booksNeeded = 40;

    $url = "https://www.googleapis.com/books/v1/volumes?q=". urlencode($query) ."&startIndex=$startIndex&maxResults=$booksNeeded";

    // Get the data with cURL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    $bookBatch = curl_exec($ch);
    curl_close($ch);

    // If we got no matches..
    if($bookBatch['totalItems'] === 0) {

        // .. but we already have some books, return those
        if(count($this->books) > 0)
            return $this->books;
        else
            return false;

    }

    // Convert the JSON to an array and merge the existing books with
    // this request's new books 
    $bookBatch = json_decode($bookBatch, true);
    $this->books['items'] = array_merge($this->books['items'], $bookBatch['items']);

    // Even if we WANT more, but the API can't give us more: stop
    if( ($bookBatch['totalItems'] - count($this->books['items'])) === 0 ) {
        return $this->books;
    }

    // We need more books, and there's more to get: use recursion
    return $this->getBooks($query, $numBooksToGet, $startIndex);

}

简单示例用法:

$books = $this->getBooks("programming", 50);

这将返回最多 50本与关键字编程相匹配的图书。希望有人会使用这个,祝你好运!

答案 1 :(得分:8)

不,它的另一个参数:max-results。但看起来一个'页面'中的最大结果数仍然设置得很低 - 为20。

例如,此查询:

http://books.google.com/books/feeds/volumes?q=php&max-results=40

......只给了我20个参赛作品。但是,您可以使用start-index param迭代集合,这很有用:

http://books.google.com/books/feeds/volumes?q=php&max-results=20&start-index=21

...然后是41,61等。它从1开始,而不是0,我已经检查过了。 )

答案 2 :(得分:0)

这是我通过 maxResults 参数获得超过20个结果的方法

'https://www.googleapis.com/books/v1/volumes?q=inauthor:danielle%20steele&maxResults=40&key=your_very_own_api_key'

轻而易举地,每个请求返回40个结果。请参见下面的屏幕截图。

enter image description here