2011-03-16 9 views
13

kodlanmış yerine: yol temsilci : JSON nesneyi-c obj eşlemek olarak kendini] benim web hizmetinden nesneyi almak için, bu i kullanmaya çalışıyorum şimdiRestKit ios - koymak - json formu i JSON</p> i kullanmak mümkün <p>[[RKObjectManager sharedManager] loadObjectsAtResourcePath ile istirahat üzerinden bir web sunucusu ile iletişim kurmak için restkit kullanan bir ios uygulaması yazıyorum

çalışıyor: [[RKObjectManager sharedManager] putObject: obj temsilci: kendini]; ve bu çağrı, web hizmetine JSON

'u değil, form olarak kodlanmış bir nesne olarak gönderir; bu durumda sorum: sharedManager'ın (veya routeur?) kodlanmış form yerine içerik türü JSON ile nasıl gönderileceği yapılandırılır. Herhangi bir kod örneği çok beğenildi.

Thx!

cevap

1

Tamam sadece bunu nasıl bulundu:

alt sınıf RKRouter.h ya da sadece

return [object propertiesForSerialization]; 

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]]; 

için RKDynamicRouter.m değiştirmek ve RestKit putObject çağrısı

için JSON üretmek
+0

Hmmm biraz daha açık olabilir misin? Ben RestKit yeni başlayan biriyim ve bunu anlamıyorum: 1- RKRouter.h bir protokol tanımlar. Ne "alt sınıf" demek istiyorsun? 2- Hangi işlevi uygular/geçersiz kılarsınız? 3- Bu yeni Router sınıfını nerede ve nasıl örneklendirirsiniz? –

9

En kolay yol, nesne yönetimini başlattığınızda özelliği ayarlamaktır. er, şöyle:

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

Bu, daha yeni sürümlerde bunu yapmanın tek yoludur. RestKit v0.20 'den –

+9

kullanımı' objectManager.requestSerializationMIMEType = RKMIMETypeJSON; ' –

+1

' [objectManager postObject: yol: parameters ...] 'kullanırken, içerik türü üstbilgisi" ben sonra bile uygulama/json "olarak ayarlanmıyordu requestSerializationMIMEType'ı ayarlayın. Ben [[objectManager HTTPClient] setDefaultHeader: @ "content-type" değerini ekledim: RKMIMETypeJSON]; ve düzgün çalışmaya başladı. – Wolfsokta

3

Evan doğrudur, ama ben bir iç içe NSDictionay vardı çünkü aynı zamanda, bir JSON dizesi gönderiyorum emin olmak için yaşadım. Eğer bir JSON dize olarak göndermek istediğiniz bir sözlük varsa

, burada bunu yapabilirsiniz:

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

Çalışan bir çözüm bulduğuna sevindim, ama yuvarlak bir deliğe bir kare peg koyuyorsun. RKObjectManager'da "postObject: yol: parametreler: başarı: başarısızlık:" yöntemine bakın. NSDictionary'ınızı 'postObject:' parametresi olarak atayabilirsiniz ve RestKit serileştirmeyi işleyecektir (eşlemeleri tanımlamaya gerek yok - sadece bir sözlük). –

0

Sen RKObjectManager sınıflara göre bireysel istekleri için serializationMIMEType değiştirip requestWithObject uygulanmasını değiştirebilirsiniz: yöntemi: yol: parametreler: alt sınıf yöneticisinde.

Gönder isteği:

SubclassedObjectManager *manager = ... 
[manager putObject:nil 
      path:pathString 
    parameters:parameters 
     success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     } 
]; 
PUT yöntemi için isteğin

Değiştir MIMEType:

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

bir nesne Yöneticisi oluşturma ve JSON biçiminde başlık eşleştirmek için özelliğini ayarlayın

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

objectManager.requestSerializationMIMEType = RKMIMETypeJSON;