2011-10-29 26 views
9

Tôi đang cố gắng để có được tất cả các thông điệp bài đăng bằng restfb, mã của tôi là như sauLàm thế nào để lấy hơn 25 thông điệp bài

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

này chỉ cung cấp cho mới nhất thông điệp 25 bài.

Parameter.with ("giới hạn", 100)

Nếu tôi đặt tham số giới hạn, nó mang lại cho 100 tin nhắn nhưng tôi không muốn giới hạn để lấy đăng bài. Vì vậy,

Tôi có thể nhận danh sách đầy đủ các bài đăng phù hợp với tiêu chí tìm kiếm mà không đặt thông số giới hạn không?

+0

Tập mặc định được trả về 25 cho tất cả các truy vấn. Bạn sẽ phải sử dụng tham số giới hạn để vượt xa điều đó. –

+0

Hãy suy nghĩ bạn phải đối phó với 'giới hạn' vì FB sẽ không cho phép bạn tăng lên nhiều tải trên các máy của nó bằng cách bỏ kích thước kết quả. – micfra

+0

vâng, có một cách ... – beinghuman

Trả lời

2

Không có cách nào để tìm nạp kết quả không giới hạn từ FB. Giới hạn mặc định được đặt thành 25. Như bạn biết, bạn có thể thay đổi điều này bằng thông số limit. Tôi chưa tìm thấy đường viền trên cho giới hạn tìm kiếm trên web. Có thể, bạn có thể đặt nó với số tiền rất cao.

5

Có thể bạn có thể thử sử dụng vòng lặp. FB không thể nhận được hơn 1000 mỗi lần, vì vậy bạn có thể sử dụng vòng lặp để nhận toàn bộ nguồn cấp dữ liệu. Sử dụng bù đắp như thế này:

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

offset sẽ là một biến và giá trị của nó sẽ 1000,2000,3000 ...

0

Như tôi đã thử nghiệm gần đây, Bạn không cần phải chỉ định bất cứ điều gì. lớp kết nối thực hiện Iterable theo cách này:

  • lấy 25 kết quả
  • hasNext kiểm tra nếu có mục tiếp theo để xử lý
  • nếu không, nó sẽ lấy trang tiếp theo của 25 kết quả

Vì vậy, về cơ bản tất cả những gì bạn cần làm là:

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

Nếu bạn muốn có một số phương pháp trả lại tiền sults Tôi sẽ rất cẩn thận, bởi vì bạn có thể trả về hàng nghìn kết quả và thu thập thông tin chúng có thể mất một thời gian (từ giây đến vài phút hoặc thậm chí hàng giờ) và mảng đối tượng kết quả sẽ thực sự lớn. Ý tưởng tốt hơn là sử dụng một số cuộc gọi không đồng bộ và kiểm tra kết quả của phương pháp theo định kỳ.

Mặc dù có vẻ như thông số "kể từ" bị bỏ qua. Bài viết được tìm nạp từ mới đến cũ nhất và tôi nghĩ rằng nó bằng cách nào đó bỏ qua tham số này khi thực hiện phân trang.

Hy vọng tôi đã làm rõ hơn cho bạn :)

0

Chúng tôi có đối tượng Iterator trong bài đăng. Vì vậy, chúng tôi có thể làm như sau:

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

Sau đó, trong mỗi thư chúng tôi sẽ có 25 thư tiếp theo.

Các vấn đề liên quan