2012-06-27 15 views
6

मैं इस बिंदु तक थोड़ी देर के लिए RestKit 0.10.0 का उपयोग कर रहे हैं और ऊपर, मैं सिर्फ अपने सर्वर से धारावाहिक वस्तुओं तैनात। लेकिन अब मुझे कुछ क्वेरी पैरामीटर के साथ सर्वर को एक GET अनुरोध करने की आवश्यकता है। पहले स्वाभाविक बात है कि मन में आया भी ऐसा ही करने के लिए गया था के रूप में मैं पोस्टिंग वस्तुओं के लिए किया था:RestKit प्राप्त क्वेरी पैरामीटर

  • वस्तु क्वेरी encapsulating के लिए एक क्रमबद्धता मानचित्रण पैरामीटर
  • वस्तु के लिए एक प्रतिक्रिया मानचित्रण नहीं बना से प्राप्त की जा रही बनाने usingBlock (postObject के बजाय: usingBlock) सर्वर
  • को परिभाषित करने और RKRequestMethodGET (बजाय RKRequestMethodPOST) के लिए एक रूटर का उपयोग
  • GetObject का उपयोग कर अनुरोध करना

मैं जल्द ही पता चला इस तरह से यह करने के लिए तो उपलब्ध संसाधनों (RestKit Wiki, RestKit Google group) खोज करने के बाद मैं अब दो समाधान वैध के रूप में माना के बारे में पता नहीं है,:

  • संसाधन पथ के लिए क्वेरी पैरामीटर जोड़।

यह पूरी तरह से काम करता है।

NSDictionary *queryParams = [NSDictionary dictionaryWithObjectsAndKeys: 
              token, @"accessToken", 
              [NSNumber numberWithInt:level], @"level", 
              [NSNumber numberWithInt:count], @"count", 
              nil]; 

NSString* resourcePath = [PEER_SUGGESTIONS_CONTROLLER_PATH stringByAppendingQueryParameters:queryParams]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath 
               usingBlock:^(RKObjectLoader *loader) { 
                loader.delegate = self; 
                loader.objectMapping = responseMapping; 
               }]; 
  • लोडर ब्लॉक में क्वेरी पैरामीटर की स्थापना।

यह क्वेरी पैरामीटर नहीं भेजता है।

RKParams *params = [RKParams params]; 
[params setValue:token forParam:@"accessToken"]; 
[params setValue:[NSNumber numberWithInt:level] forParam:@"level"]; 
[params setValue:[NSNumber numberWithInt:count] forParam:@"count"]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:PEER_SUGGESTIONS_CONTROLLER_PATH 
               usingBlock:^(RKObjectLoader *loader) { 
                loader.delegate = self; 
                loader.objectMapping = responseMapping; 
                loader.params = params; 
               }]; 

मेरे प्रश्न हैं:

  1. क्यों नहीं दूसरा समाधान काम करता है?
  2. लोडर.targetObject को शून्य पर सेट किए बिना पहला समाधान क्यों काम कर रहा है, हालांकि मेरे पास JSON प्रतिक्रिया में कोई रूट कुंजी पथ नहीं है?
  3. ऐसे मामले क्या हैं जहां मुझे getObject का उपयोग करना चाहिए: ब्लॉक विधि का उपयोग करना? इसका उद्देश्य क्या उद्देश्य है?
  4. मुझे लोडर.परैम का उपयोग करने के लिए क्या करना चाहिए? wiki से ऑब्जेक्ट मैपिंग ट्यूटोरियल का कहना है कि इस प्रॉपर्टी का उपयोग POST पैरामीटर को समाहित करने के लिए किया जा सकता है, लेकिन मुझे पॉइंट नहीं दिखाई देता है क्योंकि मैं विधि पोस्ट ऑब्जेक्ट के साथ भेजे जा रहे क्रमबद्ध ऑब्जेक्ट में पैरामीटर को लपेट सकता हूं: ब्लैक का उपयोग करना।

धन्यवाद।

[बाद में संपादित]

मेरी दूसरी सवाल का जवाब के बारे में: मैं लोडर ब्लॉक में नहीं के बराबर करने के लिए targetObject की स्थापना किया गया है जब पोस्ट अनुरोध बनाने beacause अन्यथा RestKit प्रतिक्रिया के लिए भेजने वस्तु मैपिंग का उपयोग की कोशिश करेंगे (संबंधित चर्चा के लिए यह link देखें)। लेकिन चूंकि मैं loadObjectsAtResourcePath का उपयोग कर रहा हूं: ब्लॉक का उपयोग करके: कोई ऑब्जेक्ट नहीं भेजा जा रहा है, इसलिए प्रतिक्रिया स्वाभाविक रूप से सेट लक्ष्य के बिना प्रतिक्रिया मैपिंग पर मैप करेगी।

उत्तर

4
  1. दूसरा समाधान क्यों काम नहीं करता है?

पैरामीटर एक HTTP शरीर है, जो किसी GET/HEAD अनुरोध में नहीं किया जाता है बनाने के लिए प्रयोग किया जाता है।

  1. क्यों पहला समाधान, नहीं के बराबर करने के लिए loader.targetObject सेट किए बिना काम कर रहा है, हालांकि मैं JSON उत्तर में किसी भी रूट कुंजी पथ नहीं है?

मुझे लगता है कि targetObject डिफ़ॉल्ट रूप से शून्य है। आप आमतौर पर इसे सेट नहीं करते हैं, अनुरोध आवश्यक होने पर इसे बनाएगा। प्राथमिक कुंजी या अन्य अजीब समस्याओं के बिना वस्तुओं का अनुरोध करते समय मैं इसका उपयोग करने का एकमात्र समय है। usingBlock विधि:

  1. मामलों में जहां मैं GetObject का उपयोग करना चाहिए क्या हैं? इसका उद्देश्य क्या उद्देश्य है?

यह एक सुविधाजनक तरीका है इसलिए आपको सभी सही वाक्यविन्यास याद रखने की आवश्यकता नहीं है। आंतरिक रूप से यह केवल जीईटी का उपयोग कर ऑब्जेक्ट लोड अनुरोध भेजता है।

संपादित करें:

उपयोग इस करता है, तो आप एक वस्तु को अपडेट करना चाहते है।

  1. क्या मैं loader.params के लिए इस्तेमाल करना चाहिए? विकी से ऑब्जेक्ट मैपिंग ट्यूटोरियल का कहना है कि इस प्रॉपर्टी का उपयोग POST पैरामीटर को समाहित करने के लिए किया जा सकता है, लेकिन मुझे बिंदु नहीं दिखाई देता है क्योंकि मैं पैरामीटर पैरामीटर पोस्टऑब्जेक्ट: ब्लैक का उपयोग करके भेजे गए क्रमबद्ध ऑब्जेक्ट में पैरामीटर को लपेट सकता हूं।

तुम जो भी पैरामीटर में डाल एक HTTP शरीर (या शरीर स्ट्रीम) धारावाहिक की जाएगी। दोबारा, postObject: useBlock: केवल एक सुविधा विधि है इसलिए आपको सब कुछ याद रखने की ज़रूरत नहीं है।

रेस्टकिट खुला स्रोत है। यदि आप सुनिश्चित नहीं हैं कि यह कैसे काम करता है तो आप आंतरिक रूप से पैरामीटर का पालन करने के लिए स्वतंत्र हैं। यदि आप ऐप और वेब सेवा अच्छी तरह डिज़ाइन की गई हैं, तो आप सुविधा विधियों का उपयोग करने में सक्षम होना चाहिए। कभी-कभी आप नहीं कर सकते हैं, और फिर आप कच्चे रूपों का उपयोग कर सकते हैं जैसे आपने किया है।

संपादित करें: क्यू एचआरएम, आपके बुलेट बिंदुओं को उद्धृत करते हुए संख्याओं को गड़बड़ कर दिया गया ...

+0

धन्यवाद। जीईटी/हेड अनुरोध के बारे में स्पष्टीकरण बहुत उपयोगी है। –

+0

धन्यवाद, यह एक को छोड़कर, मेरी सभी गलतफहमी को स्पष्ट करता है। आपने कहा GetObject: useBlock: केवल एक सुविधा विधि है जो GET का उपयोग करके ऑब्जेक्ट लोड अनुरोध भेजती है। यह loadObjectsAtResourcePath की परिभाषा की तरह लगता है: ब्लॉक का उपयोग:। GetObject में :ब्लॉकब्लॉक का उपयोग करके: किसी ऑब्जेक्ट को पहले पैरामीटर के रूप में निर्दिष्ट करना होगा और मुझे समझ में नहीं आता कि यह उपयोगकर्ता क्या है, क्योंकि मैं केवल एक पीईटी या पोस्ट नहीं कर रहा हूं। –

+0

उदाहरण के लिए, यदि आपके पास पहले से कोई ऑब्जेक्ट है, तो आप नवीनतम डेटा (अपडेट) प्राप्त कर सकते हैं, या आप संसाधन पथ तक पहुंच सकते हैं - दोनों एक ही काम करते हैं। आप जिस भी तरह से पसंद करते हैं/आसान है। –

3

मैं RKObjectLoader करने के लिए एक श्रेणी जोड़ने हल, वह है:

-(void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *))block; 

यहाँ यह सूची है:

विधि के लिए

-(void)getObject:(id<NSObject>)object usingBlock:(RKObjectLoaderBlock)block; 

मैं श्रेणी में एक संशोधित विधि जोड़ा एफपीआर फाइल "आरके ऑब्जेक्ट मैनेजर + क्वेरी पैरामीटर":

// 
// RKObjectManager+QueryParameters.h 
// AlphaClient 
// 
// Created by Antonio Rossi on 14/07/12. 
// 

#import <RestKit/RestKit.h> 

@interface RKObjectManager (QueryParameters) 

- (void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *))block; 
- (void)sendObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters method:(RKRequestMethod)method usingBlock:(void(^)(RKObjectLoader *))block; 

@end 

यहाँ के लिए फ़ाइल "RKObjectManager + QueryParameters.m" सूची है:

// 
// RKObjectManager+QueryParameters.m 
// AlphaClient 
// 
// Created by Antonio Rossi on 14/07/12. 
// 

#import "RKObjectManager+QueryParameters.h" 

@implementation RKObjectManager (QueryParameters) 

- (void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *loader))block { 
    [self sendObject:object queryParameters:queryParameters method:RKRequestMethodGET usingBlock:block]; 
} 

- (void)sendObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters method:(RKRequestMethod)method usingBlock:(void(^)(RKObjectLoader *))block { 
    NSString *resourcePath = [self.router resourcePathForObject:object method:method]; 
    [self sendObject:object toResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) { 
     loader.method = method; 

     // need to transform the original URL because when method is GET the additional paramentes don't get added 
     RKURL *originalBaseURL = [RKURL URLWithBaseURL:[loader.URL baseURL]]; 
     NSString *resourcePath = [self.router resourcePathForObject:object method:RKRequestMethodGET]; 
     RKURL *authTokenURL = [originalBaseURL URLByAppendingResourcePath:resourcePath queryParameters:queryParameters]; 
     [loader setURL:authTokenURL]; 

     block(loader); 
    }]; 
} 

@end 

एक और चरण अपने कार्यान्वयन फ़ाइल में #import "RKObjectManager+QueryParameters.h" जोड़ना है। इस नई विधि में यह माना जाता है कि router RKObjectManager की संपत्ति को कॉल करने से पहले परिभाषित किया गया है।

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