2011-10-29 10 views
9

Sto cercando di ottenere tutti i messaggi post utilizzando restfb, il mio codice è il seguenteCome per andare a prendere più di 25 messaggi POST

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; 
} 

Questo dà solo gli ultimi messaggi di posta 25.

Parameter.with ("limite", 100)

Se i set di parametri limite, dà 100 messaggi, ma io non voglio limitare a recupero inviare messaggi. Quindi,

Esiste comunque un elenco completo di messaggi che soddisfano i criteri di ricerca senza impostare il parametro limite?

+0

Il set predefinito è 25 restituito per tutte le query. Dovrai usare il parametro limit per andare oltre. –

+0

Pensa di avere a che fare con 'limit' perché FB non ti permetterà di aumentare molto carico sulle sue macchine limitando la dimensione dei risultati. – micfra

+0

sì, c'è un modo ... – beinghuman

risposta

2

Non c'è modo di recuperare risultati illimitati da FB. Il limite predefinito è impostato su 25. Come sai, è possibile modificarlo utilizzando il parametro limit. Non ho trovato un limite superiore per la ricerca di limiti nel web. Forse, puoi impostarlo su una quantità molto alta.

5

Forse puoi provare ad usare un loop. FB non può ottenere più di 1000 ogni volta, quindi puoi usare il loop per ottenere l'intero feed. Utilizzare l'offset come questo:

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

Offset sarà una variabile e il suo valore sarà 1000,2000,3000 ...

0

Come ho provato di recente, Non è necessario specificare nulla. classe Connection Iterable implementa in questo modo:

  • fetch 25 risultati
  • controllo hasNext se non v'è elemento successivo per elaborare
  • in caso contrario, si preleverà pagina successiva di 25 risultati

Così basicamente tutto ciò che dovete fare è questo:

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 
     } 
} 

Se volete avere qualche tipo di metodo che ritorna Sults Sarei molto attento, perché puoi restituire migliaia di risultati e strisciarli tra di loro potrebbe richiedere del tempo (da secondi a minuti o persino ore) e il risultato che l'array di oggetti sarà davvero grande. Una migliore idea è usare una chiamata asincrona e controllare periodicamente i risultati del metodo.

Anche se sembra che il parametro "since" sia ignorato. I post vengono recuperati dal più recente al più vecchio e penso che in qualche modo tralascia questo parametro quando si esegue il paging.

Spero reso più chiaro per voi :)

0

Abbiamo un oggetto Iterator in Post. Quindi possiamo farlo in questo modo:

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

Quindi in ogni messaggio avremo i prossimi 25 messaggi.

Problemi correlati