Как обойти ограничения скорости или квоты 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: []});
    }
  }

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *