获取 JSON 文本不是从数组或对象以及允许未设置片段的选项开始的



有什么方法可以在我的以下登录代码中打印/NSLOG由API返回的字符串或数组:

-(void)loginToAPI:(NSString *)email password:(NSString *)password {
    NSString *controller = @"login";
    NSString *action =  @"authenticate";
    NSDictionary *params = @{@"username": email,
                             @"userpass": password,
                             @"controller":  controller,
                             @"action": action,
                             @"app_id": APP_ID,
                             @"app_key": APP_KEY};
    NSLog(@"params %@", params);
    if ([self isNetworkAvailable]) {
        AFHTTPRequestOperationManager *client = [AFHTTPRequestOperationManager manager];
        client.responseSerializer.acceptableContentTypes = [client.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
        [client POST:[[Config sharedInstance] getAPIURL]
          parameters:params
             success:^(AFHTTPRequestOperation *operation, id responseObject) {
                 NSDictionary *jsonObject= responseObject;
                 NSString *status = [jsonObject objectForKey:@"status"];
                 NSLog(@"Request Successful, response '%@'", jsonObject);
                 if ([status isEqualToString:@"success"]) {
                     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
                     NSDictionary *data = [jsonObject objectForKey:@"data"];
                     NSDictionary *userDict = [data objectForKey:@"user"];
                     NSDictionary *djsaDict = [data objectForKey:@"djsa"];
                     User *currentUser = [[User alloc] initWithProperties:userDict];
                     [currentUser save];
                     DJSA_Cutomer *djsa = [[DJSA_Cutomer alloc] initWithProperties:djsaDict];

                     NSData *userData = [NSKeyedArchiver archivedDataWithRootObject:currentUser];
                     NSData *djsaData = [NSKeyedArchiver archivedDataWithRootObject:djsa];
                     [userDefaults setObject:userData forKey:@"currentUser"];
                     [userDefaults setObject:djsaData forKey:@"djsa_customer"];
                     [userDefaults synchronize];
                     [[NSNotificationCenter defaultCenter] postNotificationName: @"LOGIN_SUCCESS" object:currentUser userInfo:nil];
                 } else {
                     [[NSNotificationCenter defaultCenter] postNotificationName: @"LOGIN_FAILED" object:nil userInfo:nil];
                 }
             } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                 NSLog(@"Request Failed with Error - loginToAPI: %@, %@", error, error.userInfo);
                 [[NSNotificationCenter defaultCenter] postNotificationName: @"SERVER_ERROR" object:nil userInfo:nil];
             }];
    }
}

它总是失败并转到"请求失败并出错 - 登录到 API"部分。是否可以查看服务器返回的实际值,以便诊断问题?

谢谢!

我遇到了同样的问题。就我而言,解决方案是

client.responseSerializer = [AFHTTPResponseSerializer serializer];

我这样做了,但我仍然遇到同样的错误。问题是我设置的是client.requestSerializer而不是client.responseSerializer。小错误,但需要很多时间。

您可以从操作对象的响应属性中获取状态代码,这应该可以让您了解出了什么问题:

failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Request Failed with Error - loginToAPI: %@, %@", error, error.userInfo);
    NSLog(@"%@", [NSHTTPURLResponse localized​String​For​Status​Code:operation.response.statusCode]);
    [[NSNotificationCenter defaultCenter] postNotificationName: @"SERVER_ERROR" object:nil userInfo:nil];
}];

否则,最好使用查尔斯网络代理之类的工具来检查实际的请求和响应。它有一个免费试用版,应该足以满足您的需求,并且相对容易设置。

替换此行:

client.responseSerializer.acceptableContentTypes = [client.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

有了这个:

[client.securityPolicy setValidatesDomainName:NO];
[client.securityPolicy setAllowInvalidCertificates:YES];
client.responseSerializer = [AFHTTPResponseSerializer serializer];

最新更新