服务器接口返回非JSON数据时AFNetworking的异常抛出和正确配置

我们使用AFNetworking时常用的解析器是AFJSONResponseSerializer,这样可以在block中直接得到字典或数组对象,因为AFNetworking已经帮我们序列化好了,我们可以直接使用。
但是在一些情况下AFN会抛出异常,如-10163840的错误,这个时候必须对服务器响应和AFN进行分析。

常用的AFN配置代码类似于:

@interface XLHTTPSessionManager : AFHTTPSessionManager
+(instancetype)defaultManager;
-(void)configCommonHttpHeaders:(NSDictionary *)headers;
@end

@implementation XLHTTPSessionManager
+(instancetype)defaultManager{
    XLHTTPSessionManager *manager = [self manager];
    if (!manager) {
        return manager;
    }
    AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
    response.removesKeysWithNullValues = YES;
    [manager setResponseSerializer:response];
    [manager setRequestSerializer:[AFJSONRequestSerializer serializer]];
    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    
    return manager;
}
@end

使用时是这样的:

XLHTTPSessionManager *manager = [XLHTTPSessionManagerdefaultManager];
[managerGET:url parameters:paramDic success:^(NSURLSessionDataTask *task, id responseObject) {
         NSDictionary *responseDic = responseObject;

} failure:^(NSURLSessionDataTask *task, NSError *error) {
       
}];

该配置会将服务器响应当作json来处理,AFNetworking会以json的形式去解析,将服务器返回数据解析成一个字典或数组。
如果服务器返回json格式的数据,AFNetworking的序列化器会解析成功;但如果服务器返回xlm或html或其它无意义字符串,AFN无法解析得到字典或数组对象从而抛异常。实际上请求是成功的,只是用AFJSONResponseSerializer解析器无法解析而已。


AFN抛出异常主要有以下几种情况:

1.报错-1016:

Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x60000042bc20> { URL: } { status code: 200, headers {}

NSLocalizedDescription=Request failed: unacceptable content-type: text/html

2.报错3840:

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

产生报错的原因,都是由于后台返回的不是一个有效的JSON对象,而AFN以JSON的标准来解析,因为无法正常序列化JSON而抛出了一个error。

解决办法也比较简单,以下是解决思路:

一、AFN默认还是以JSON解析器对服务器返回数据进行JSON序列化,确保服务器返回JSON时能正确解析;在某些接口非常确认服务器响应非JSON时,在代码中重新设置解析器为 AFHTTPResponseSerializer,亦能确保服务器响应为非JSON时可以正确解析。

二、最后回归到代码,看看代码中的具体实现:
解决方法如下:

XLHTTPSessionManager *manager = [XLHTTPSessionManager defaultManager];
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager POST:url parameters:nilsuccess:^(NSURLSessionDataTask *task, id responseObject) {        
        NSString *responseStr = [[NSStringalloc]initWithData:responseObject encoding:NSUTF8StringEncoding];       
        DDLogInfo(@"--------- %@",responseStr);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
       
}];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • AFN什么是AFN全称是AFNetworking,是对NSURLConnection、NSURLSession的一...
    醉叶惜秋阅读 1,169评论 0 0
  • 预测智能、机器学习、人工智能、高级分析。所有这些术语都在一些重要营销、商业和分析会议上吸引人们的注意。  如果你和...
    塔拉的红土阅读 282评论 1 1
  • 我时常不清楚自己想要什么 我也不曾想过我需要得到什么 很迷茫吧 也会很无助 想过的很好但总觉得现在的自己无能为力 ...
    亞子阅读 469评论 0 1