ios - 在 AFJSONRequestOperation 中接受无效的 JSON?

标签 ios objective-c json afnetworking afhttpclient

我正在修复现有项目中的错误。问题是 AFHTTPClient 期望有效的 JSON 响应,但服务器返回一些乱码,如“”\”操作完成\””(所有引号和括号都在返回中)。这导致操作失败,并命中失败 block ,因为它无法解析响应。尽管如此,服务器仍返回状态代码 200,并且很高兴操作已完成。

我有一个像这样扩展 AFHTTPClient 的类(从我的 .h 文件中执行)

@interface AuthClient : AFHTTPClient

  //blah blah blah

@end

在我的实现文件中,类被初始化如下:

- (id)initWithBaseURL:(NSURL *)url{
    if (self = [super initWithBaseURL:url]) {        
        self.parameterEncoding = AFFormURLParameterEncoding;
        self.stringEncoding = NSASCIIStringEncoding;

        [self setDefaultHeader:@"Accept" value:@"application/json"];
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    }

    return self;
}

我正在做的调用是在上面提到的类中完成的,并且是这样发生的:

- (void)destroyToken:(NSString *)token onCompletion:(void (^)(BOOL success))completion onFailure:(void (^)(NSError *error))failure{

    [self postPath:@"TheServerURL" parameters:@{@"token": token} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSError *error;
        //Do some stuff
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //Don't want to be here.
    }];
}

在失败 block 内,错误在错误对象的 _userInfo 部分中返回为:

[0] (null) @"NSDebugDescription": @"JSON 文本未以数组或对象开头,并且未设置允许片段的选项。"

错误代码为 3480。

通过谷歌搜索,我了解到我需要设置类似 NSJSONReadingAllowFragments 的内容,但我不确定当前设置的方式/位置。有人有什么想法吗?

最佳答案

听起来响应根本不是 JSON。那么,为什么不直接接受 HTTP 响应本身,而不是尝试像 JSON 一样处理它呢?

如果您提交一个 JSON 格式的请求,但只想返回文本响应,使用 AFNetworking 2.0,您可以执行如下操作:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlString parameters:@{@"token":token} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"responseString: %@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

或者,在 1.x 中:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
client.parameterEncoding = AFJSONParameterEncoding;
NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:@{@"token" : token}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"response: %@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

[client enqueueHTTPRequestOperation:operation];

关于ios - 在 AFJSONRequestOperation 中接受无效的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965151/

相关文章:

ios - 从 plist 刷新数据

iphone - 如何在不打开FBFriendPickerViewController iOS的情况下获取好友列表

objective-c - 使用比例变换与边界操作调整 CATiledLayer 的大小

javascript - 检查 JSON 对象中是否存在日期

Javascript 变量到 Php json 解码

ios - #SWIFT 类协议(protocol)错误的选择器

ios - SwiftUI 以异步方式加载很长的列表

ios - 对象不使用三角形和坐标渲染/绘制,SceneKit

objective-c - 核心数据对象不会存储

javascript - 检索存储在存储在 JSON 中的数组中的字符串值仅返回字符串的第一个字符