使用 AFNetworking 2 将 Json 数组发送到服务器时出错

Posted

技术标签:

【中文标题】使用 AFNetworking 2 将 Json 数组发送到服务器时出错【英文标题】:error in sending Json array to server using AFNetworking 2 【发布时间】:2014-01-09 08:12:03 【问题描述】:

我正在尝试使用 AFNetworking 将 Json 数组发送到服务器。这是我的 Json 数组格式


    "friendList": [
      "id": 1, "username": "user1", "name":"person1", "friendUsername":"fUser1", "friendName":"fName1",
      "id": 2, "username": "user2", "name":"person2", "friendUserID":"fUser2", "friendName":"fName2",
      "id": 3, "username": "user3", "name":"person3", "friendUserID":"fUser3", "friendName":"fName3",...
    ]
   

这是我将 Json 发送到服务器的代码

    NSMutableArray *friendsArray = [NSMutableArray new];
    NSDictionary *params1 = @@"id": @"1",
                             @"username":@"user1",
                             @"name":@"person1",
                             @"friendUsername":@"fUser1",
                             @"friendName":@"ffName1";

    NSDictionary *params2 = @@"id": @"2",
                             @"username":@"user2",
                             @"name":@"person2",
                             @"friendUsername":@"fUser2",
                             @"friendName":@"ffName2";

    NSDictionary *params3 = @@"id": @"3",
                             @"username":@"user3",
                             @"name":@"person3",
                             @"friendUsername":@"fUser3",
                             @"friendName":@"ffName3";

    [friendsArray addObject:params1];
    [friendsArray addObject:params2];
    [friendsArray addObject:params3];


AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];


NSDictionary *parameters = @@"friendsList":friendsArray;
NSLog(@"%@", parameters);

manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];

[manager POST:@"http://localhost:8080/RestWebServices/Rest/Post" parameters:parameters    success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"JSON: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
    NSLog(@"Error: %@", operation.response);
];

我收到此错误Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.)

我不知道我在这里做错了什么。我的代码对我来说似乎是正确的。请帮忙。

编辑:

这是我收到的日志

Error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x8b63c40 NSDebugDescription=Invalid value around character 0.
2014-01-09 21:57:25.497 ServerJsonParsingExample[1431:70b] status code = 400
2014-01-09 21:57:25.497 ServerJsonParsingExample[1431:70b] for operation: <NSHTTPURLResponse: 0x8e611e0>  URL: http://localhost:8080/RestfulWebServices/Rest/Seemo   status code: 400, headers 
    Connection = close;
    "Content-Type" = "text/plain";
    Date = "Thu, 09 Jan 2014 16:27:25 GMT";
    Server = "Apache-Coyote/1.1";
    "Transfer-Encoding" = Identity;
 

我已经添加到代码中,但错误仍然存​​在

manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

【问题讨论】:

【参考方案1】:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONRequestSerializer *serializer = [AFJSONRequestSerializer serializer];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.requestSerializer = serializer;

【讨论】:

【参考方案2】:

希望它会起作用....

    AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:[NSURL urlWithString:@"http://localhost:8080/RestWebServices/Rest/Post"];
   [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
   [httpClient setDefaultHeader:@"Accept" value:@"application/json"];    
    [AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
    httpClient.parameterEncoding = AFJSONParameterEncoding;

    [httpClient postPath:nil parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 

             failure:^(AFHTTPRequestOperation *operation, NSError *error) 

            ];

【讨论】:

我正在使用 AFNetworking 2。您的代码来自早期版本。【参考方案3】:

您的代码对我来说似乎是正确的,并且看起来您已经非常正确地创建了 JSON 对象。您是否检查过服务器在 responseObject 中返回的内容。我猜responseObject 不是有效的 JSON 并产生此错误。

【讨论】:

嘿,你检查来自服务器的 JSON 了吗? 我已经添加了来自服务器的响应,请检查上面的编辑 我在您的响应/日志中没有看到 JSON 类型的对象。您的服务器似乎没有正确发送 JSON。 我在服务器端创建了客户端并测试了响应是否给了我正确的 json,我不知道为什么它将“text/plain”作为内容类型。当我发送 GET 请求时,它运行良好,并从 ios 应用程序给我正确的 json 响应。【参考方案4】:

在您的服务器端,确保您已将正确的内容类型设置为“application/json”。我遇到了同样的问题,因为我的一个调用缺少显示响应为 JSON 的内容类型标头。

【讨论】:

以上是关于使用 AFNetworking 2 将 Json 数组发送到服务器时出错的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 将 [] 方括号添加到发送到服务器的 json

AFNetworking 2.0:是不是可以将纯 json 放入 POST 请求的正文中?

AFNetworking 2.0 图片上传和 JSON 返回错误

使用 AFNetworking 将 JSON 解析为 NSDictionary

AFNetworking 2.0 发布效果不佳

如何通过 AFNetWorking 2.0 将 JSON 格式的数据发送到 Web? [复制]