2011-03-16 11 views
13

मैं JSONRestKit ios - के बजाय के रूप इनकोडिंग

मैं का उपयोग करने में सक्षम हूँ [[RKObjectManager sharedManager] loadObjectsAtResourcePath साथ बाकी के माध्यम से एक वेब सर्वर के साथ संवाद करने restkit का उपयोग करता है या किसी iOS एप्लिकेशन लिख रहा हूँ json - डाल : स्वयं] JSON के रूप में मेरी वेब सेवा से ऑब्जेक्ट प्राप्त करने के लिए, इसे obj-c ऑब्जेक्ट पर मैप करें, यह ठीक काम करता है

अब मैं उपयोग करने का प्रयास कर रहा हूं: [[RKObjectManager sharedManager] putObject: obj प्रतिनिधि: self]; और यह कॉल वेब सेवा पर एक ऑब्जेक्ट को एन्कोडेड के रूप में भेजता है और JSON

इसलिए मेरा प्रश्न है: साझा किए गए फॉर्म के बजाय सामग्री प्रकार JSON के साथ भेजने के लिए साझा प्रबंधक (या मार्गर?) को कॉन्फ़िगर कैसे करें।

कोई भी कोड उदाहरण बहुत सराहना की।

Thx!

उत्तर

1

ठीक है बस इसे कैसे करना पाया:

उपवर्ग RKRouter.h या सिर्फ

return [object propertiesForSerialization]; 

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]]; 

को RKDynamicRouter.m में बदल सकते हैं और RestKit putObject कॉल

के लिए JSON उत्पन्न
+0

हम आप थोड़ा और स्पष्ट हो सकता है? मैं एक रेस्टकिट शुरुआती हूं और मुझे यह नहीं मिला: 1- RKRouter.h प्रोटोकॉल को परिभाषित करता है। इसका मतलब क्या है "subclassing"? 2- आप किस समारोह को लागू/ओवरराइड करते हैं? 3- आप इस नए राउटर वर्ग को कहां और कैसे चालू करते हैं? –

9

सबसे आसान तरीका यह है कि जब आप वस्तु प्रबंधन शुरू करते हैं तो बस संपत्ति को सेट करना सबसे आसान तरीका है एर, इसलिए जैसे:

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://url.com"]; 
objectManager.serializationMIMEType = RKMIMETypeJSON; 
+0

नए संस्करणों पर ऐसा करने का यही एकमात्र तरीका है। –

+9

RestKit v0.20 के रूप में 'objectManager.requestSerializationMIMEType = RKMIMETypeJSON; ' –

+1

का उपयोग करते समय' [objectManager postObject: path: पैरामीटर ...]' का उपयोग करते समय सामग्री-प्रकार शीर्षलेख "एप्लिकेशन/जेसन" पर सेट नहीं किया जा रहा था अनुरोध SerializationMIMEType सेट करें। मैं '[[objectManager HTTPClient] setDefaultHeader: @ "content-type" मान: RKMIMETypeJSON] जोड़ना समाप्त कर दिया; 'और यह ठीक से काम करना शुरू कर दिया। – Wolfsokta

3

इवान सही है, लेकिन मैं भी मैं JSON स्ट्रिंग भेज रहा हूँ क्योंकि मैं एक नेस्टेड NSDictionay था सुनिश्चित करने के लिए, किया है।

आप एक शब्दकोश आप JSON स्ट्रिंग के रूप में भेजना चाहते हैं, तो यहाँ कैसे आप यह कर सकते है:

// create a JSON string from your NSDictionary 
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 
                options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string 
                error:&error]; 
NSString *jsonString = [[NSString alloc] init]; 
if (!jsonData) { 
    NSLog(@"Got an error: %@", error); 
} else { 
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
} 

// make the post using the objectManager if you want to map the response to a model 
RKObjectManager* objectManager = [RKObjectManager sharedManager]; 
[objectManager loadObjectsAtResourcePath:@"/api/" delegate:self block:^(RKObjectLoader* loader) { 
    loader.serializationMIMEType = RKMIMETypeJSON; // We want to send this request as JSON 
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Plan class]]; 
    loader.resourcePath = @"/api/"; 
    loader.method = RKRequestMethodPOST; 
    loader.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON]; 
}]; 
+0

मुझे खुशी है कि आपको एक समाधान मिल गया है जो काम करता है, लेकिन आप एक गोल छेद में एक स्क्वायर पेग डालने की तरह हैं। 'PostObject: पथ: पैरामीटर: सफलता: विफलता:' RKObjectManager पर विधि देखें। आप अपने NSDictionary को 'postObject:' पैरामीटर के रूप में डाल सकते हैं और RestKit serialization को संभालेगा (मैपिंग को परिभाषित करने की कोई आवश्यकता नहीं है - यह सिर्फ एक शब्दकोश है)। –

0

आप RKObjectManager उपवर्गीकरण द्वारा व्यक्तिगत अनुरोध के लिए serializationMIMEType बदल सकते हैं और requestWithObject के कार्यान्वयन बदल सकते हैं: विधि: पथ: पैरामीटर: उपclassed प्रबंधक में।

संदेश का अनुरोध:

SubclassedObjectManager *manager = ... 
[manager putObject:nil 
      path:pathString 
    parameters:parameters 
     success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     } 
]; 
PUT विधि के लिए अनुरोध के

संशोधित माइम प्रकार:

- (NSMutableURLRequest *)requestWithObject:(id)object method:(RKRequestMethod)method path:(NSString *)path parameters:(NSDictionary *)parameters 
{ 
    NSMutableURLRequest *request = [super requestWithObject:object method:method path:path parameters:parameters]; 
    if (method&RKRequestMethodPUT) { 
    NSError *error = nil; 
    NSData *serializedJSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error]; 
    [request setValue:RKMIMETypeJSON forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:serializedJSON]; 
    } 

    return request; 
} 
0

एक वस्तु प्रबंधक बनाएँ और JSON प्रारूप में शीर्ष लेख से मेल खाते के लिए गुण सेट

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://mobile.com"]]; 
[objectManager addResponseDescriptorsFromArray:@[responseDescriptor]]; 

objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
संबंधित मुद्दे