The keyword is maxResults
, not max-results
, as in raina77ow's answer. Source As stated in the documentation, the maximum number of books that can be obtained right away is 40. However, you can overcome this limitation with a few queries, for example, using this PHP function:
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 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 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 more to get: use recursion return $this->getBooks($query, $numBooksToGet, $startIndex); }
A simple use case:
$books = $this->getBooks("programming", 50);
which will return up to 50 books that match keyword programming. Hope someone will use this, good luck!
source share