2013-08-20 12 views
6

Próbuję wysłać parametry do mojego serwera za pośrednictwem POST, i to działa ogólnie, ale nie mogę wymyślić, jak wysłać JSON, który zawiera tablicę jako jeden z parametrów . Oto, co próbowałem:AFNetworking wyślij tablicę w parametrach JSON żądania końcowego

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:myURL]]; 
NSMutableArray *objectsInCart = [NSMutableArray arrayWithCapacity:[_cart count]]; 
for(NSDictionary *dict in _cart) 
{ 
    NSObject *object = [dict objectForKey:@"object"]; 
    NSDictionary *objectDict = @{@"product_id": [NSString stringWithFormat:@"%d",[object productID]], 
           @"quantity": [NSString stringWithFormat:@"%d", [[dict objectForKey:@"count"] intValue]], 
           @"store_id": [NSString stringWithFormat:@"%d", [Store getStoreID]], 
           @"price": [NSString stringWithFormat:@"%.2f", [object price]]}; 
    [objectsInCart addObject:objectDict]; 
} 
NSError *error = nil; 
NSString *cartJSON = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:objectsInCart 
                        options:NSJSONWritingPrettyPrinted 
                         error:&error] 
              encoding:NSUTF8StringEncoding]; 

if(error) 
{ 
    NSLog(@"Error serializing cart to JSON: %@", [error description]); 
    return; 
} 

NSDictionary *parameters = @{@"status": @"SUBMITTED", 
          @"orders": cartJSON}; 

NSMutableURLRequest *orderRequest = [httpClient requestWithMethod:@"POST" 
                  path:@"/app/carts" 
                 parameters:parameters]; 

AFJSONRequestOperation *JSONOperation = [[AFJSONRequestOperation alloc] initWithRequest:orderRequest]; 

Jednak pojawia się błąd podczas wysyłania tego JSON. Wszelkie sugestie są mile widziane!

+0

Nie wiem, czego oczekuje serwer, ale zazwyczaj każdy element w JSON ma klucz, w tym tablicę. Właśnie wysyłasz tablicę bez klucza. Wypróbuj 'NSString * cartJSON = @" 'products':% @ ", [[NSString alloc] initWithData: [NSJSONSerialization dataWithJSONObject: objectsInCart options: NSJSONWritingPrettyPrinted error: & error] encoding: NSUTF8StringEncoding]; – dirkgroten

+0

Jeśli spojrzysz na słownik 'parameters', kluczem do tablicy jest' @ "zamówienia" ' – Mason

+0

OK, mój zły, ominąłem to. Czy spojrzałeś na faktyczne dane przesyłane przez linię? Doszedłem do wniosku, że tak bardzo cenię aplikację, jak serwer proxy Charlesa, by przechwytywać cały ruch z mojej aplikacji na zewnętrzne serwery. – dirkgroten

Odpowiedz

9

nie widzę dokąd określając chcesz opublikować JSON, więc założę się, że wysyłasz formularz URL parametrów kodowania, który wygląda tak, zgodnie z dokumentacją AFHTTPClient:

If a query string pair has a an NSArray for its value, each member of the array will be represented in the format field[]=value1&field[]=value2 . Otherwise, the pair will be formatted as "field=value". String representations of both keys and values are derived using the -description method. The constructed query string does not include the ? character used to delimit the query component.

Jeśli serwer jest rzeczywiście spodziewa ci odpowiedzieć JSON, dodać to w drugim wierszu powiedzieć AFNetworking że:

// AFNetworking 1.0 
// httpClient is a subclass of AFHTTPClient 
httpClient.parameterEncoding = AFJSONParameterEncoding; 

// AFNetworking 2.0 
// httpClient is a subclass of AFHTTPRequestOperationManager or AFHTTPSessionManager 
httpClient.requestSerializer = AFJSONRequestSerializer; 

Będziesz wtedy usunąć wywołanie NSJSONSerialization i po prostu umieścić objectsInCart do parameters DIC kryminalny.

Na marginesie: to normalne podklasy AFHTTPRequestOperationManager lub AFHTTPSessionManager (AFNetworking 2.0) lub AFHTTPClient (AFNetworking 1.0) i umieścić tego typu konfiguracji w swojej metodzie initWithBaseURL:. (Prawdopodobnie nie chcesz rozpoczynać nowego klienta dla każdego żądania.)

+0

Gah tak, znalazłem to wcześniej, powinienem zaktualizować post. Dzięki! – Mason