Taxa que limita o acesso à API do Reddit

Taxa que limita o acesso à API do Reddit

1. Visão geral

Neste artigo rápido, vamos continuar melhorandoour small Reddit app emrate limiting the way it has access to the live Reddit API.

A ideia simples é que queremos ter certeza dewe don’t hit their API to much - caso contrário, o Reddit começará a bloquear as solicitações. Faremos bom uso do GoiabaRateLimiter para chegar lá.

2. UmRedditTemplate personalizado

Primeiro, vamos criar um modelo Reddit -a small client for the Reddit API - que consolidará todas as comunicações de baixo nível em um único componente:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RedditTemplate {

    @Autowired
    @Qualifier("redditRestTemplate")
    private OAuth2RestTemplate redditRestTemplate;

    private RateLimiter rateLimiter;

    public RedditTemplate() {
        rateLimiter = RateLimiter.create(1);
    }

    public JsonNode getUserInfo() {
        rateLimiter.acquire();
        return redditRestTemplate.getForObject(
          "https://oauth.reddit.com/api/v1/me", JsonNode.class);
    }

    public JsonNode submitPost(MultiValueMap params) {
        rateLimiter.acquire();
        return redditRestTemplate.postForObject(
          "https://oauth.reddit.com/api/submit", params, JsonNode.class);
    }

    public String needsCaptcha() {
        rateLimiter.acquire();
        return redditRestTemplate.getForObject(
          "https://oauth.reddit.com/api/needs_captcha.json", String.class);
    }

    public String getNewCaptcha() {
        rateLimiter.acquire();
        Map param = new HashMap();
        param.put("api_type", "json");
        return redditRestTemplate.postForObject(
          "https://oauth.reddit.com/api/new_captcha", param, String.class, param);
    }

    public OAuth2AccessToken getAccessToken() {
        rateLimiter.acquire();
        return redditRestTemplate.getAccessToken();
    }
}

Algumas coisas interessantes estão acontecendo aqui.

Primeiro -we’re using the Session scope for this bean - simplesmente para que cada usuário / sessão em nosso aplicativo obtenha sua própria instânciaRedditTemplate.

Agora - oOAuth2RestTemplate já tem suporte para manter o escopo da sessão de credenciais, mas vamos além disso aqui e definimos o escopo da sessão de instância do bean real - para que possamos tambémrate limit each user separately

O que nos leva à lógica de limitação de taxa real - simplificando, estamos usando GoiabaRateLimiter para adquirir uma licençabefore letting the request through and hitting the live API.

3. ORedditController

A seguir - vamos começar a usar este novoRedditTemplate emRedditContoller - por exemplo:

@Controller
public class RedditController {
    @Autowired
    private RedditTemplate redditTemplate;

    @Autowired
    private UserRepository userReopsitory;

    @RequestMapping("/login")
    public String redditLogin() {
        JsonNode node = redditTemplate.getUserInfo();

        loadAuthentication(node.get("name").asText(),
          redditTemplate.getAccessToken());
        return "redirect:home.html";
    }
}

4. Conclusão

Nesta parte do estudo de caso, adicionamos o limite de taxa ao aplicativo Reddit, paramake sure we’re not blocked by the live API for to much activity.

Este não é um problema teórico - mas na verdade algo que eu encontrei algumas vezes usando o app

São esses tipos de pequenas melhorias que eventualmente levarão a um aplicativo maduro e utilizável - então, estou animado com esta etapa específica.