Tôi đã viết một đoạn mã nhỏ trong JAVA, rằng kiểm tra tham số limit
với bốn giá trị khác nhau (10, 100, 1000 và 10000) khi truy vấn nguồn cấp dữ liệu tin tức của người dùng của Facebook bằng cách sử dụng API biểu đồ mở và RestFB client. Như bạn sẽ thấy, nó có một hành vi kỳ lạ ...API đồ thị mở Facebook: hành vi kỳ lạ của giới hạn thông số khi nhận được nguồn cấp dữ liệu tin tức của người dùng được phân trang
Kịch bản:
public static void main(String[] args) {
// vars
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
FacebookClient client = new DefaultFacebookClient(accessToken);
Connection<Post> home;
List<Post> postList;
Map<String, Post> postMap;
int i;
// limits to test
String[] limits = {"10", "100", "1000", "10000"};
for (String limit : limits) {
// init list and map (looking for duplicate posts)
postList = new LinkedList<Post>();
postMap = new LinkedHashMap<String, Post>();
// get news feed
home = client.fetchConnection(id + "/home", Post.class, Parameter.with("limit", limit));
// going through pages
i = 1;
for (List<Post> page : home) {
for (Post post : page) {
// store into list
postList.add(post);
// store into map (unique post id)
postMap.put(post.getId(), post);
}
i++;
}
// sort posts by created time
Collections.sort(postList, new Comparator<Post>() {
@Override
public int compare(Post post1, Post post2) {
return post1.getCreatedTime().compareTo(post2.getCreatedTime());
}
});
// log
try {
FileWriter out = new FileWriter("log/output.txt", true);
out.write("LIMIT: " + limit + "\n");
out.write("\tPAGES: " + (i - 1) + "\n");
out.write("\tLIST SIZE: " + postList.size() + "\n");
out.write("\tMAP SIZE: " + postMap.size() + "\n");
out.write("\tOLDER POST: " + dateFormat.format(postList.get(0).getCreatedTime()) + "\n");
out.write("\tYOUGNER POST: " + dateFormat.format(postList.get(postList.size() - 1).getCreatedTime()) + "\n");
out.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Output:
LIMIT: 10
PAGES: 7
LIST SIZE: 56
MAP SIZE: 56
OLDER POST: 2009-03-22 14:58:03
YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 100
PAGES: 3
LIST SIZE: 174
MAP SIZE: 172
OLDER POST: 2012-01-12 23:01:34
YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 1000
PAGES: 2
LIST SIZE: 294
MAP SIZE: 292
OLDER POST: 2009-03-22 14:58:03
YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 10000
PAGES: 2
LIST SIZE: 294
MAP SIZE: 292
OLDER POST: 2009-03-22 14:58:03
YOUGNER POST: 2012-05-11 15:48:49
Giải thích và câu hỏi:
Rõ ràng, bạn không thể nhận được tất cả các bài viết người dùng đã có trên nguồn cấp dữ liệu tin tức của anh ấy kể từ khi tài khoản của anh ấy được tạo. Giới hạn?
Với
limit
trong số 100, 1000 và 10000, tôi phải có mỗi lần hai bài đăng trùng lặp trong toàn bộ nguồn cấp tin được trả lại (174 - 172 = 194 - 192). Tại sao? Tôi không bao giờ thấy cùng một bài đăng hai lần trên nguồn cấp tin tức cá nhân của tôi ...Với (và chỉ với) số
limit
của 100, bài đăng cũ hơn tôi nhận được tạo trong năm 2012, trong khi các giá trị khác củalimit
làm truy vấn truy xuất một bài đăng đã được tạo trong năm 2009. Tôi có thể hiểu rằng với một số trênlimit
(1000 hoặc 10000), truy vấn sẽ truy xuất các bài đăng cũ hơn. Nhưng tại sao alimit
trong số 10 yêu cầu truy vấn bài đăng cũ hơn truy vấn bị giới hạn bởi 100?Điểm cuối cùng nhưng không kém phần quan trọng: Tôi không nhận được cùng số lượng bài đăng. Rõ ràng, số lượng
limit
cao hơn, số lượng bài đăng được truy xuất càng cao. Những gì tôi nghĩ đầu tiên, đó là hậu quả duy nhất của một số nhỏ hơn làlimit
là số trang cao hơn (trường hợp đó), nhưng số lượng bài viết đã truy xuất sẽ không thay đổi. Nhưng nó có. Tại sao? Điều đó nói rằng, số lượng bài viết dường như hội tụ giữa mộtlimit
100 và 1000, vì số lượng bài viết giống hệt với mộtlimit
1000 và mộtlimit
của 10000.
PS: chỉ định một since
và/hoặc tham số until
cho truy vấn không thay đổi bất cứ điều gì.
Bất kỳ câu trả lời/nhận xét nào đều được chào đón :)
Chúc mừng.
Edit:
Đây là của tôi tốt nhất recall:
LIMIT: 200
PAGES: 3
LIST SIZE: 391
MAP SIZE: 389
OLDER POST: 2012-01-27 14:17:16
YOUGNER POST: 2012-05-11 16:52:38
Tại sao 200? Nó có được chỉ định ở bất kỳ đâu trong số documentation không?
Cảm ơn câu trả lời của bạn. Tôi đã thấy [câu hỏi mà bạn đã yêu cầu] (http://goo.gl/P9kpP). Rõ ràng, giới hạn là hạn chế, nhưng đó là lạ, chúng tôi không thể tìm thấy bất kỳ chi tiết trong [doc] (http://bit.ly/f5O0Oz). Cá nhân tôi không thể nhận được hơn 389 bài đăng và với số lượng giới hạn là 200 (xem phần chỉnh sửa). Vì vậy, tôi có thể nói rằng bạn không thể nhận được hơn 400 bài đăng, chứ không phải 500. Số 4 là nhiều hơn về số trang: tại sao giới hạn 10 làm cho truy vấn truy xuất ít bài đăng hơn giới hạn 100? Điều đó chỉ nên tác động đến số lượng trang của số trang, không phải số lượng bài đăng. – sp00m
Tôi đã cập nhật mã, tôi hy vọng nó sẽ giúp bạn :) – Jashwant
Cảm ơn. Bạn xứng đáng với nó :) – sp00m