rarala2020
@rarala2020 (ら らら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

APIリクエスト数を抑えながら無限スクロールでコンテンツ追加を実現する方法

楽天商品検索APIを活用し、商品リストを作成しています。

スクロールの位置が下部1%の範囲に来るたびにページ数を追加取得して
無限スクロールするようなUIを実現したいのですが、今のコードだと
取得したいページ数(100ページ)に達する前に、
APIリクエスト数が上限に達してしまい読み込みエラーになってしまいます。

これを回避しながら無限スクロールでページ(商品表示)を追加していく方法はありませんでしょうか?

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="css/reset.css" />
    <link rel="stylesheet" href="css/style.css" />
    <script src="js/jquery-2.1.3.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <title>Document</title>
  </head>
  <body>

    <div class="cssgrid"> </div>


<script>
// ------------------
// グローバル変数
// ------------------
let APPID = "-------アプリID--------"; //アプリID *必須
let MAX_PAGE = 100; //最大取得ページ件数
let HITS = 30; //1ページ当たりの表示件数
let KEYWORD = encodeURIComponent("カラコン"); //絞り込みしたい単語

// ------------------
// 楽天API
// ------------------
$(function () {

 //ページ数を変数化
  let n = 1;

 //下部までスクロールすると次のページの商品を追加
  $(window).bind("scroll", function () {
        scrollHeight = $(document).height();
        scrollPosition = $(window).height() + $(window).scrollTop();
        if ((scrollHeight - scrollPosition) / scrollHeight <= 0.01) {
            //スクロールの位置が下部1%の範囲に来た場合ページ数を追加
            if (n < MAX_PAGE) {
            search_rakuten(n+1);
            }
        } 
    });

  //ループで表示したいHTML部分を作成 
  function put_item(item) {  
    let h = '<div>'
        + '<img src="'
        + item.mediumImageUrls[0].imageUrl.replace("?_ex=128x128","")
         + '" class="img">'
        + '<span><a href="'
        + item.affiliateUrl
        + '" target="_blank">●</a></span></div>';
    $(".cssgrid").append(h);
  }

  //ajax
  function search_rakuten(page) {
    $.ajax({
      url:
        "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?format=json&applicationId=" +
        APPID +
        "&keyword=" +
        KEYWORD +
        "&page=" +
        page +
        "&hits=" +
        HITS,
      type: "get",
      dataType: "json",
      timeout: 10000,
      async: "true",
    })
      //読み込み成功時の処理
      .done(function (data) {
        // 1商品ずつhtml置く
        for (let i in data.Items) {
          put_item(data.Items[i].Item);
        }        
      })
      //読み込み失敗時の処理
      .fail(function (data) {
        console.log("読み込みエラー");
      });
  }
  search_rakuten(n);

});

</script>

</body>
</html>
0

1Answer

APIリクエスト数が上限に達してしまい読み込みエラーになってしまいます。

楽天apiは1秒間に1APIしか許されないと聞いたんですが、
同じ様な理由の429エラーでしょうか?

どれくらい途中までは出来ているのかも知りたいです。

0Like

Your answer might help someone💌