2011-03-16 11 views
13

estoy escribiendo una aplicación para iOS que utiliza restkit para comunicarse con un servidor web a través Resto con JSONios RestKit - put - JSON en lugar de forma codificada

soy capaz de utilizar [[RKObjectManager sharedManager] loadObjectsAtResourcePath: delegado ruta : self] para obtener un objeto de mi servicio web como JSON, asignarlo al objeto obj-c, funciona bien

ahora estoy tratando de usar: [[RKObjectManager sharedManager] putObject: obj delegado: self]; y esta llamada envía un objeto al servicio web como formulario codificado y no JSON

así que mi pregunta es: ¿cómo configurar el sharedManager (o el enrutador?) para enviar con el tipo de contenido JSON en lugar del formulario codificado.

cualquier ejemplo de código muy apreciado.

Thx!

Respuesta

1

bien acaba de encontrar la manera de hacerlo:

RKRouter.h subclase o simplemente cambiar en RKDynamicRouter.m

return [object propertiesForSerialization]; 

a

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]]; 

y RestKit generar JSON para putObject llamada

+0

Hmmm, ¿puedes ser un poco más explícito? Soy un principiante de RestKit y no lo entiendo: 1- RKRouter.h define un protocolo. ¿Qué quieres decir con "subclasificarlo"? 2- ¿Qué función implementa/anula? 3- ¿Dónde y cómo instancias esta nueva clase de enrutadores? –

9

La manera más fácil es simplemente establecer la propiedad cuando inicializa el objeto maneg er, así:

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

Esta es la única forma de hacerlo en las versiones más nuevas. –

+9

a partir de RestKit v0.20 use 'objectManager.requestSerializationMIMEType = RKMIMETypeJSON;' –

+1

Al usar '[objectObject postObject: path: parameters ...]' el encabezado content-type no se configuró en "application/json" incluso después de que establecer el requestSerializationMIMEType. Terminé agregando el valor '[[objectManager HTTPClient] setDefaultHeader: @" content-type ": RKMIMETypeJSON];' y comenzó a funcionar correctamente. – Wolfsokta

3

Evan es correcta, pero he tenido que también asegurarse de que estoy enviando una cadena JSON, porque tenía un NSDictionay anidada.

Si usted tiene un diccionario que desea enviar como una cadena JSON, aquí es cómo puede hacerlo:

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

Me alegro de que hayas encontrado una solución que funciona, pero estás colocando una clavija cuadrada en un agujero redondo. Consulte el método 'postObject: path: parameters: success: failure:' en RKObjectManager. Puedes simplemente poner tu NSDictionary como el parámetro 'postObject:' y RestKit manejará la serialización (no es necesario definir mapeos, es solo un diccionario). –

0

Puede cambiar serializationMIMEType para solicitudes individuales subclasificando RKObjectManager y cambiar implementación de requestWithObject: Método: ruta de acceso: parámetros: en el administrador subclasificado.

Enviar solicitud:

SubclassedObjectManager *manager = ... 
[manager putObject:nil 
      path:pathString 
    parameters:parameters 
     success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     } 
]; 

Modificar MIMEType de solicitud de método 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

Crear un administrador de objetos y establezca la propiedad para hacer coincidir la cabecera en formato JSON

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

objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
Cuestiones relacionadas