AFNetwork 2.0 POST问题,Cocoa错误3840(JSON文本不以数组开头)


AFNetworking 2.0 POST issue, Cocoa error 3840(JSON text did not start with array...)

我正在尝试在我的本地服务器上调用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。

谢谢。

当您像

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

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

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

服务器很可能返回了一个状态代码,指示某些问题和一个响应正文,其中包含某种内容类型与预期不同的"错误响应"(例如,它返回了 text/html)。

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

这对

我有用:

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