2011-10-29 10 views
9

मैं restfb का उपयोग करके सभी संदेशों को पोस्ट प्राप्त करने के लिए कोशिश कर रहा हूँ, मेरे कोड के रूप में इस प्रकार हैकैसे लाने के लिए 25 से अधिक पद संदेशों

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 ("सीमा", 100)

तो मैं सीमा पैरामीटर सेट है, यह 100 संदेश देता है, लेकिन मैं संदेश पोस्ट प्राप्त करते समय को सीमित करने के लिए नहीं करना चाहती। तो,

क्या वैसे भी मैं सीमा पैरामीटर सेट किए बिना खोज मानदंड से मेल खाने वाले पोस्ट संदेशों की पूरी सूची प्राप्त कर सकता हूं?

+0

सभी प्रश्नों के लिए डिफ़ॉल्ट सेट 25 लौटा दिया गया है। इससे परे जाने के लिए आपको सीमा पैरामीटर का उपयोग करना होगा। –

+0

सोचें कि आपको 'सीमा' से निपटना होगा क्योंकि एफबी आपको परिणाम आकार को अनलिमिटेड करके अपनी मशीनों पर अधिक भार बढ़ाने की अनुमति नहीं देगा। – micfra

+0

हाँ एक रास्ता है ... – beinghuman

उत्तर

2

एफबी से असीमित परिणाम प्राप्त करने का कोई तरीका नहीं है। डिफ़ॉल्ट सीमा 25 पर सेट है। जैसा कि आप जानते हैं, आप इसे limit पैरामीटर का उपयोग करके बदल सकते हैं। मुझे वेब खोजने की सीमा के लिए ऊपरी सीमा नहीं मिली है। शायद, आप इसे बहुत अधिक राशि पर सेट कर सकते हैं।

5

शायद आप एक लूप का उपयोग करने का प्रयास कर सकते हैं। एफबी प्रत्येक बार 1000 से अधिक नहीं मिल सकता है, इसलिए आप पूरे फ़ीड प्राप्त करने के लिए लूप का उपयोग कर सकते हैं। इस तरह की भरपाई का प्रयोग करें:

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

ऑफसेट हो जाएगा एक चर और इसके मूल्य 1000,2000,3000 हो जाएगा ...

0

जैसा कि मैंने हाल ही में परीक्षण किया है, तुम कुछ भी निर्दिष्ट करने के लिए नहीं है। कनेक्शन वर्ग इस तरह से 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 
     } 
} 

यदि आप किसी प्रकार की विधि चाहते हैं जो फिर से वापस आती है sults मैं बहुत सावधान रहूंगा, क्योंकि आप हजारों परिणामों को वापस कर सकते हैं और उनके माध्यम से क्रॉलिंग कुछ समय ले सकते हैं (सेकंड से मिनट या यहां तक ​​कि घंटों तक) और परिणाम ऑब्जेक्ट सरणी वास्तव में बड़ी होगी। बेहतर विचार कुछ एसिंक्रोनस कॉल का उपयोग करना और समय-समय पर विधि के परिणामों की जांच करना है।

हालांकि ऐसा लगता है कि पैरामीटर "तब से" अनदेखा किया जाता है। पोस्ट नवीनतम से सबसे पुराने तक लाए जाते हैं और मुझे लगता है कि पेजिंग करते समय यह किसी भी तरह से इस पैरामीटर को छोड़ देता है।

आशा मैं आपके लिए और अधिक स्पष्ट कर दिया :)

0

हम पोस्ट में एक इटरेटर वस्तु है। इसलिए हम इसे इस तरह से कर सकते हैं:

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

फिर प्रत्येक संदेश में हम अगले 25 संदेश होगा।

संबंधित मुद्दे