Как получить более 25 сообщений - PullRequest
9 голосов
/ 29 октября 2011

Я пытаюсь получить все почтовые сообщения, используя restfb, мой код выглядит следующим образом

public Connection<Post> publicSearchMessages(Date fromDate, Date toDate) {
    Connection<Post> messages = publicFbClient.fetchConnection("search",
            Post.class,
            Parameter.with("q", "Watermelon"),
            Parameter.with("since", fromDate),
            Parameter.with("until", toDate),
            Parameter.with("type", "post"));

    return messages;
}

Это дает только последние 25 почтовых сообщений.

Parameter.with ("limit", 100)

Если я установил параметр limit, он выдаст 100 сообщений, но я не хочу ограничивать выборку сообщений.Итак,

Можно ли в любом случае получить полный список почтовых сообщений, соответствующих критериям поиска, без установки параметра limit?

Ответы [ 4 ]

5 голосов
/ 30 марта 2012

Может быть, вы можете попробовать использовать цикл. FB не может получить больше 1000 каждый раз, поэтому вы можете использовать цикл для получения целых каналов. Используйте смещение следующим образом:

Parameter.with("limit", 1000));
Parameter.with("offset", offset));

Смещение будет переменной, и ее значение будет 1000,2000,3000 ...

2 голосов
/ 04 ноября 2011

Нет возможности получить неограниченные результаты от FB.По умолчанию установлен предел 25. Как вы знаете, вы можете изменить его, используя параметр limit.Я не нашел верхнюю границу для поиска лимитов в Интернете.Может быть, вы можете установить его на очень большое количество.

0 голосов
/ 18 марта 2015

У нас есть объект Iterator в Post. Таким образом, мы можем сделать это так:

Connection<Post> messages = publicFbClient.fetchConnection(...) ;
someMethodUsingPage(messages);
    while (messages.hasNext()) {
        messages = facebookClient.fetchConnectionPage(messages.getNextPageUrl(), Post.class);
        someMethodUsingPage(messages);
    }

Тогда в каждом сообщении мы будем иметь следующие 25 сообщений.

0 голосов
/ 10 сентября 2014

Как я недавно проверял, вам не нужно ничего указывать.Класс соединения реализует Iterable следующим образом:

  • выборка 25 результатов
  • hasNext проверяет, есть ли следующий элемент для обработки
  • , если нет, он будет извлекать следующую страницу25 результатов

В общем, все, что вам нужно сделать, это:

Connection<Post> messages = publicFbClient.fetchConnection("search",
        Post.class,
        Parameter.with("q", "Watermelon"),
        Parameter.with("since", fromDate),
        Parameter.with("until", toDate),
        Parameter.with("type", "post"));

for (List<Post> feedConnectionPage : messages) {
        for (Post post : myFeedConnectionPage) {
                 // do stuff with post
        }
}

Если вы хотите иметь какой-то метод, который возвращает результаты, я был бы очень осторожен, потому что выможет возвращать тысячи результатов, и их просмотр может занять некоторое время (от секунд до минут или даже часов), и массив объектов результатов будет очень большим.Лучшая идея состоит в том, чтобы использовать некоторый асинхронный вызов и периодически проверять результаты метода.

Хотя кажется, что параметр "Since" игнорируется.Сообщения извлекаются из самых новых в самые старые, и я думаю, что этот параметр каким-то образом не учитывается при выполнении подкачки.

Надеюсь, я прояснил это для вас:)

...