2011-11-04 17 views
5

Intentando publicar información para parámetros anidados en una aplicación de rieles y teniendo algunos problemas.Usar ASIHTTPRequest para POST parámetros anidados usando un NSDictionary

#pragma mark - Begin Network Operations 
- (void)beginNetworkOperation { 
    NSURL *requestURL = [NSURL URLWithString:[self retrieveURL]]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:requestURL]; 

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 
    [request setShouldContinueWhenAppEntersBackground:YES]; 
#endif 

    [request setRequestMethod:@"PUT"]; 

    [request addRequestHeader:@"Content-Type" value:@"application/json"]; 

    [request addPostValue:strClientId forKey:@"client_id"]; 
    [request addPostValue:strAccessToken forKey:@"access_token"]; 

    NSDictionary *assetDictionary = [NSDictionary dictionaryWithObject:self.tags forKey:@"tags"]; 
    [request addPostValue:assetDictionary forKey:@"asset"]; 

    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestFinished:)]; 
    [request setDidFailSelector:@selector(requestFailed:)]; 
    [request startSynchronous]; 
} 

self.tags es sólo un NSString con valores separados por comas, sin embargo una vez que llega el servidor rieles el parámetro de etiquetas no se puede leer (params [: activos] [: tags]).

Respuesta

2

Intente pasar el diccionario como una cadena JSON y no como un objeto de diccionario.

Usted puede hacer que el uso de la biblioteca IOS5 JSON, o éste para una mayor compatibilidad:

https://github.com/stig/json-framework

Lo que hago es usar appendPostData porque estoy bastante seguro de que el establecimiento de la cabecera (addRequestHeader) y el uso de addPostValue no son funciones compatibles Aquí es un ejemplo de mi código:

ASIFormDataRequest *request; 
[request addRequestHeader:@"Content-Type" value:@"application/json"]; 
[request appendPostData:[[SBJsonWriter new] dataWithObject:myDictionaryToPassAsAnArgument]]; 

Cuando se utiliza appendPostData, no se puede utilizar cualquier addPostValue. Tienes que poner todo en el diccionario.

+0

He intentado esto haciendo [request addPostValue: [assetDictionary JSONRepresentation] forKey: @ "asset"]; y obtengo el mismo error en el servidor de rieles "TypeError (no se puede convertir Symbol en Integer)" que realmente parece no tener ningún sentido ... – Kyle

+0

Tal vez sea por el comas en su cadena, porque los comas son el separador de JSON. Intenta reemplazar el comas en tu sting por otra cosa para ver si funciona usando - stringByReplacingOccurrencesOfString: withString: – MatLecu

+0

Mis datos de prueba aún no contienen comas. – Kyle

2

Aquí hay un fragmento de código de trabajo con JSONKit en iOS.

[request addRequestHeader:@"Content-Type" value:@"application/json"]; 

NSMutableDictionary *requestDict = [[NSMutableDictionary alloc] init]; 
[requestDict setObject:@"iSteve" forKey:@"UserId"]; 
[requestDict setObject:@"1" forKey:@"CompanyCode"]; 
[requestDict setObject:@"IN" forKey:@"LineOfBusiness"]; 
[requestDict setObject:@"M" forKey:@"LineOfBusinessClassification"]; 
[requestDict setObject:pricingVariablesListString forKey:@"CarQuoteString"]; 
[request appendPostData:[requestDict JSONData]]; 
+0

En jQuery .appendPostData no funciona en IE. Estoy usando IE 10 ¿hay alguna solución para esto? Error de tiempo de ejecución de JavaScript: el objeto no admite la propiedad o el método 'appendPostData' – JaiSankarN

Cuestiones relacionadas