6

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

谢谢你。

4

3 回答 3

5

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

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

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

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

于 2013-11-09T10:53:20.313 回答
2

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

于 2013-11-09T10:59:03.027 回答
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];
          }];
于 2016-01-13T11:26:48.543 回答