2013-08-20 27 views
6

Tôi đang cố gắng gửi thông số tới máy chủ của mình qua POST và nó hoạt động bình thường, nhưng tôi không thể tìm ra cách gửi JSON chứa mảng như một tham số . Dưới đây là những gì tôi đã thử:AFNetworking gửi mảng theo tham số JSON của yêu cầu bài

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]; 

Tuy nhiên, tôi gặp lỗi khi gửi JSON này. Bất kỳ đề xuất được nhiều đánh giá cao!

+0

Tôi không biết máy chủ mong đợi điều gì, nhưng thông thường, mọi mục trong JSON đều có khóa, kể cả mảng. Bạn chỉ gửi mảng ngay bây giờ mà không cần chìa khóa cho nó. Hãy thử 'NSString * cartJSON = @" 'sản phẩm':% @ ", [[NSString alloc] initWithData: [NSJSONSerialization dataWithJSONObject: objectsInCart tùy chọn: NSJSONWritingPrettyPrinted error: & error] encoding: NSUTF8StringEncoding]; – dirkgroten

+0

Nếu bạn nhìn vào từ điển 'tham số', khóa cho mảng là' @ "đơn đặt hàng" ' – Mason

+0

ok, xấu của tôi tôi đã bỏ lỡ điều đó. Bạn có nhìn vào dữ liệu thực tế đang được gửi qua đường không? Tôi đã đến để đánh giá cao một ứng dụng như Charles proxy rất nhiều để chặn tất cả lưu lượng truy cập từ ứng dụng của tôi đến các máy chủ bên ngoài. – dirkgroten

Trả lời

9

Tôi không thấy nơi bạn đang xác định bạn muốn đăng JSON, vì vậy tôi đặt cược bạn đang gửi mẫu URL Parameter Encoding, mà đi như thế này, theo các tài liệu 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.

Nếu máy chủ của bạn đang thực sự mong đợi bạn đăng JSON, thêm này trên dòng thứ hai để nói AFNetworking rằng:

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

sau đó, bạn sẽ loại bỏ cuộc gọi của bạn để NSJSONSerialization và chỉ cần đặt objectsInCart vào parameters dic tionary.

Một mặt lưu ý: đó là bình thường để phân lớp AFHTTPRequestOperationManager hoặc AFHTTPSessionManager (AFNetworking 2.0) hoặc AFHTTPClient (AFNetworking 1.0) và đặt kiểu cấu hình này trong phương pháp initWithBaseURL: của bạn. (Có thể bạn không muốn quay lên một ứng dụng khách mới cho mọi yêu cầu.)

+0

Gah yeah Tôi đã tìm thấy điều này trước đó, nên đã cập nhật bài đăng. Cảm ơn! – Mason

Các vấn đề liên quan