【问题标题】:AFNetworking send array in JSON parameters of post requestAFNetworking 在 post 请求的 JSON 参数中发送数组
【发布时间】:2013-08-22 22:02:50
【问题描述】:

我正在尝试通过 POST 将参数发送到我的服务器,它通常可以正常工作,但我不知道如何发送包含数组作为参数之一的 JSON。这是我尝试过的:

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

但是,发送此 JSON 时出现错误。任何建议都非常感谢!

【问题讨论】:

  • 我不知道服务器期望什么,但通常情况下,JSON 中的每个项目都有一个键,包括数组。您现在只是发送数组,没有密钥。试试 `NSString *cartJSON = @"'products':%@", [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:objectsInCart options:NSJSONWritingPrettyPrinted error:&error] encoding:NSUTF8StringEncoding];
  • 如果查看parameters 字典,数组的键是@"orders"
  • 好吧,我错过了。您是否查看了通过线路发送的实际数据?我非常看重像 Charles 代理这样的应用程序,它可以拦截从我的应用程序到外部服务器的所有流量。
  • 为了将来参考使用 AFNetworking 2.xx 的其他人,您不必将任何数组或字典序列化为 JSON,只需将它们原样传递给您的 AFHTTPRequestOperationManager,AFNetworking 将处理所有的东西。但不要忘记在接受的答案中添加manager.requestSerializer = [AFJSONRequestSerializer serializer];

标签: ios arrays json post afnetworking


【解决方案1】:

我没有看到您指定要在哪里发布 JSON,所以我打赌您正在发送表单 URL 参数编码,根据 AFHTTPClient 文档,如下所示:

如果查询字符串对的值有一个NSArray,则数组的每个成员都将以field[]=value1&field[]=value2 格式表示。否则,该对将被格式化为“field=value”。键和值的字符串表示是使用-description 方法派生的。构造的查询字符串不包括 ?用于分隔查询组件的字符。

如果您的服务器确实希望您发布 JSON,请将其添加到第二行以告诉 AFNetworking:

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

然后,您将删除对NSJSONSerialization 的调用,并将objectsInCart 放入parameters 字典中。

附注:继承 AFHTTPRequestOperationManagerAFHTTPSessionManager (AFNetworking 2.0) 或 AFHTTPClient (AFNetworking 1.0) 并将此类配置放入您的 initWithBaseURL: 方法中是正常的。 (您可能不想为每个请求启动一个新客户端。)

【讨论】:

  • 嗯,是的,我之前发现了这个,应该更新帖子。谢谢!
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 2016-09-29
  • 2017-09-18
  • 1970-01-01
  • 2016-08-02
  • 2014-10-07
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多