AFNetworking 2.0 POST问题,Cocoa错误3840(JSON文本没有以数组开头......)

时间:2013-11-09 10:32:48

标签: php ios objective-c json afnetworking-2

我试图在本地服务器上调用api.php(使用MAMP)。 正在调用服务器端api.php,但php代码中的_POST内容包含以下错误:

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.) UserInfo = 0x15d7bdd0 {NSDebugDescription = JSON text did not start with array or object and option to allow fragments not set.}

我尝试将JSON POST请求发送到api.php的应用是使用AFNetworking 2的iOS应用

这是我的请求代码:

- (void)postUpdateRequest
{
    if (!dataModel)
        dataModel = [[DataModel alloc] init];

    NSDictionary *params = @{@"foo": @"bar2"};

    NSLog(@"%@",params);

/*    NSDictionary *params = @{@"cmd":@"update",
                             @"user_id":[dataModel userId],
                             @"token":[dataModel deviceToken]
                             };//@"ip_address":[dataModel getIPAddress]};*/

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager POST:ServerApiURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

我查看了整个互联网,但找不到我的具体问题的答案。 无论我做什么,我都会得到同样的错误。

为什么我的JSON格式不正确?我似乎也无法找到一种方法来嗅探我实际发送的JSON。

谢谢。

3 个答案:

答案 0 :(得分:5)

当您在示例中使用API​​时,您的HTTP消息将使用内容类型application/x-www-form-urlencoded来组成。在内部,您的param字典由AFN编码(尽管不是严格按照w3c的规定更正),并设置为请求正文。

由于您未指定Accept标头,因此服务器可以自由选择可能的响应数据(如果有)的内容类型。

收到回复后,您需要始终检查HTTP状态代码和响应正文的内容类型(如果有)。

可能是服务器返回了一个状态代码,表明存在某个问题,并且响应正文包含某种不同类型的内容类型的“错误响应”(例如,它返回了text / html)。

答案 1 :(得分:2)

你可以在模拟器中运行应用程序或在通过共享wifi连接到mac的设备上使用类似wireshark(http://www.wireshark.org/)的smth,你正在运行whireshark来跟踪实际的请求和响应。

答案 2 :(得分:2)

这对我有用:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

 [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    manager.requestSerializer = requestSerializer;

[manager POST:URLString
       parameters:params
          success:^(AFHTTPRequestOperation *operation, id responseObject) {
              NSLog(@"JSON: %@", responseObject);
              [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              NSLog(@"Error: %@", error);
              [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
          }];