Как обойти ограничения скорости или квоты API книг Google?
Если вы когда-либо интегрировали API Google Книг в свое веб-приложение или мобильное приложение, вы должны знать, что существуют ограничения скорости или квоты на количество запросов. Обычно предел скорости составляет ок. 1000 запросов в день.
Ограничения или квоты можно увидеть на панели инструментов облачной платформы Google, и вы всегда можете запросить дополнительную квоту прямо через предоставленные параметры панели. Однако в большинстве случаев эти апелляции занимают много времени и часто отклоняются.
Теперь вы не хотите, чтобы ваши пользователи или клиенты застряли или начали получать ошибки, как только будет достигнут лимит. Я отчаянно пытался придумать решение для лучшего пользовательского опыта. Итак, я разработал хак или, можно сказать, инновационный подход, чтобы обеспечить беспроблемный опыт для пользователей. Это разработано в React Native и Google Firebase, но вы можете создать аналогичный подход по своему выбору языка.
Во-первых, я интегрировал функцию поиска книг в Alogolia. Вот шаги, которые я выполнил, чтобы обеспечить беспроблемный поиск книг:
1). Каждый раз, когда пользователь выполняет поиск книги, выполняется вызов API-интерфейса Google Books, а затем API-интерфейса поиска algolia. Теперь есть 2 сценария:
а. Успех API Google (не достигнут предел квоты): в этом случае набор результатов из книг Google (возвращенные книги) создает соответствующие записи с названием книги, автором, описанием, издателем и т. д. для индексов Algolia. Перейти к шагу 2)
б. Сбой API Google (достигнут предел квоты): перейдите к шагу 2)
2). Вызовите Algolia API с пользовательским поисковым вводом. Возвращенный набор результатов отображается пользователям на внешнем экране или странице.
Таким образом, когда люди ищут книги в вашем приложении, соответствующие книги (из google api) постепенно добавляются в ваши индексы algolia. Постепенно вы начнете накапливать или хранить тысячи книг с соответствующими данными (ISBN, название, изображение, автор, описание и т. д.).
Пример кода в React Native & Firebase:
searchFilterFunction = text => {
var algoliaSearchResults = [];
this.setState({loadingProducts: true, data: [], searchText: text});
var searchResults = [];
if(text.length >= 3)
{
var baseURL = '
baseURL = baseURL + encodeURIComponent('intitle:' + text);
baseURL = baseURL + '&key=******Google Books API Key******';
baseURL = baseURL + '&maxResults=5&country=IN&langRestrict=en';
fetch(baseURL).then((response) => response.json()).then((responseData) => {
if(responseData.items)
{
responseData.items.map((topLevel, key1) => {
var description = '';
var category = '';
var google_id = '';
var google_link = '';
var page_count="";
var language="";
var publisher="";
var published_date="";
if(topLevel.volumeInfo.title && topLevel.volumeInfo.authors && topLevel.volumeInfo.industryIdentifiers && topLevel.volumeInfo.categories && topLevel.volumeInfo.imageLinks)
{
if(topLevel.volumeInfo.authors[0] && topLevel.volumeInfo.industryIdentifiers[0].identifier && topLevel.volumeInfo.categories[0] && topLevel.volumeInfo.imageLinks.thumbnail)
{
if(topLevel.volumeInfo.description)
description = topLevel.volumeInfo.description;
if(topLevel.id)
google_id = topLevel.id;
if(topLevel.volumeInfo.infoLink)
google_link = topLevel.volumeInfo.infoLink;
if(topLevel.volumeInfo.pageCount)
page_count = topLevel.volumeInfo.pageCount;
if(topLevel.volumeInfo.language)
language = topLevel.volumeInfo.language;
if(topLevel.volumeInfo.publisher)
publisher = topLevel.volumeInfo.publisher;
if(topLevel.volumeInfo.publishedDate)
published_date = topLevel.volumeInfo.publishedDate;
searchResults.push({
title: topLevel.volumeInfo.title,
isbn: topLevel.volumeInfo.industryIdentifiers[0].identifier,
author_1: topLevel.volumeInfo.authors[0],
thumbnail: topLevel.volumeInfo.imageLinks.thumbnail,
description: description,
category: topLevel.volumeInfo.categories[0],
google_id: google_id,
google_link: google_link,
page_count: page_count,
language: language,
publisher: publisher,
published_date: published_date,
objectID: topLevel.volumeInfo.industryIdentifiers[0].identifier
});
firebase.database().ref('products/'+topLevel.volumeInfo.industryIdentifiers[0].identifier+'/').once('value').then((snapshot) => {
if(!snapshot.val())
{
firebase.database().ref('products/'+topLevel.volumeInfo.industryIdentifiers[0].identifier).update({
title: topLevel.volumeInfo.title,
isbn: topLevel.volumeInfo.industryIdentifiers[0].identifier,
author_1: topLevel.volumeInfo.authors[0],
thumbnail: topLevel.volumeInfo.imageLinks.thumbnail,
description: description,
category: topLevel.volumeInfo.categories[0],
google_id: google_id,
google_link: google_link,
page_count: page_count,
language: language,
publisher: publisher,
published_date: published_date,
objectID: topLevel.volumeInfo.industryIdentifiers[0].identifier
});
}
});
}
}
});
}
}).then(() => {
index.saveObjects(searchResults)
.then(() => {
var clientSearch = algoliasearch(ALGOLIA_ID, ALGOLIA_SEARCH_KEY);
var indexSearch = clientSearch.initIndex('products');
index.setSettings({'searchableAttributes': ['title', 'author_1']});
index.search({query: text})
.then(function(responses) {
// Response from Algolia:
//
responses.hits.map((value, key) => {
algoliaSearchResults.push(value);
});
}).then(() => {
if(algoliaSearchResults.length >= searchResults.length)
this.setState({loadingProducts: false, data: algoliaSearchResults});
else
this.setState({loadingProducts: false, data: searchResults});
});
})
.catch(error => {
//alert('Error when importing products into Algolia:',error);
});
}).catch((error) => {
var clientSearch = algoliasearch(ALGOLIA_ID, ALGOLIA_SEARCH_KEY);
var indexSearch = clientSearch.initIndex('products');
index.setSettings({'searchableAttributes': ['title', 'author_1']});
index.search({query: text})
.then(function(responses) {
// Response from Algolia:
//
responses.hits.map((value, key) => {
algoliaSearchResults.push(value);
});
}).then(() => {
if(algoliaSearchResults.length >= searchResults.length)
this.setState({loadingProducts: false, data: algoliaSearchResults});
else
this.setState({loadingProducts: false, data: searchResults});
});
}).done();
}
else {
this.setState({loadingProducts: false, data: []});
}
}