2011-11-04 9 views
5

Tentativo di inviare informazioni sui parametri nidificati a un'app per rails e di avere qualche problema.Utilizzo di ASIHTTPRequest ai parametri nidificati POST mediante 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 è solo un NSString con valori separati da virgola, ma una volta che arriva al server di rotaie il parametro tag non può essere letto (params [: asset] [: tag]).

risposta

2

Provare a passare il dizionario come una stringa JSON e non un oggetto dizionario.

Potete farlo utilizzando la libreria iOS5 JSON, o questo per una maggiore compatibilità:

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

Quello che faccio è usare appendPostData perché io sono abbastanza sicuro che l'impostazione l'intestazione (addRequestHeader) e l'utilizzo di addPostValue non sono funzioni compatibili. Ecco un esempio del mio codice:

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

Quando si utilizza appendPostData, non è possibile utilizzare qualsiasi addPostValue. Devi mettere tutto nel dizionario.

+0

Ho provato questo facendo [request addPostValue: [assetDictionary JSONRepresentation] forKey: @ "asset"]; e ottengo lo stesso errore sul server dei binari "TypeError (non può convertire Symbol in Integer)" che sembra davvero non avere alcun senso .... – Kyle

+0

Forse è a causa dei coma nella stringa, perché i comas sono il separatore di JSON. Prova a sostituire i coma nella tua puntura con qualcos'altro per vedere se funziona utilizzando - stringByReplacingOccurrencesOfString: withString: – MatLecu

+0

I miei dati di test non contengono ancora virgole. – Kyle

2

Ecco uno snippet di codice funzionante con JSONKit su 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

In jQuery .appendPostData non funziona in IE. Sto usando IE 10 c'è qualche soluzione per questo? Errore di runtime JavaScript: l'oggetto non supporta la proprietà o il metodo 'appendPostData' – JaiSankarN

Problemi correlati