今天做公司的项目,在项目中引入了AFNetworking这个框架,在进行get请求的时候遇见了关于AFNetworking的一个缺陷吧算是。出现了错误,展开错误信息之后显示:
Request failed: unacceptable content-type: text/plain,
网上找了一下解决方案,这里记录一下,以后再遇到这个问题就这样解决了。
究其原因是因为AFNetworking没有对text/plain这种类型的返回数据进行支持,所以,打开AFNetworking的AFURLResponseSerialization.m文件,找到代码:
- (instancetype)init {
self = [super init];
if (!self) {
return nil;
}
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
return self;
}
发现果然没有text/plain,然后我们手动添加一下,这个格式,之后代码变为:
- (instancetype)init {
self = [super init];
if (!self) {
return nil;
}
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil];
return self;
}
重要提醒:上面手动的该之后添加一个解析的项目的办法并不好,因为,既然用了人家的第三方框架,尤其是使用cocoaPods这种情况,再次更新的时候就又改回去了,所以,根本的办法还是后端的童鞋给点力
但是随之而来的是另外一个错误:
JSON text did not start with array or object and option to allow fragments not set.
这个问题的原因是因为回来的东西不是一个Json的数据,而是另外一种东西(我遇到的我们公司临时回来的只是一个拼接的字符串),(这句话是在网上看到的,我没有注意:当你用浏览器去请求时发现响应头是这样的:
Content-Type: text/html;charset=UTF-8
但是afNetwork 请求是这样的:
Content-Type:text/plain;charset=ISO-8859-1 )
所以AFNetworking在进行Json解析的时候无从下手,因为回来的并不是一个字典或者数组包裹的Json。
解决问题的方法比较暴力,我们在AFNetworking的网络请求的地方,得到manager之后加上这两句代码:
AFHTTPSessionManager *mannager = [AFHTTPSessionManager manager];
// 处理返回来的不是一个json的数据,临时的处理data用
mannager.requestSerializer = [AFHTTPRequestSerializer serializer];
mannager.responseSerializer = [AFHTTPResponseSerializer serializer];
这样做导致的结果是真正的网络请求回来,你得到的responseObject是个NSData,然后在请求成功的回调里处理这个NSData:
NSData *data = responseObject;
NSString *allSn = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
这样就得到了一个返回数据的一个字符串,解决了我项目中遇到的这个问题。
另外,还遇见了由于安全性问题,我们的项目中测试用的地址是http的不是https,导致错误:
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
目前解决办法是在info.plist中添加一个设置项:
NSAppTransportSecurity为Dictionary,NSAllowsArbitraryLoads为Boolean
这样问题解决。
上面实际上这么做也是不好的,苹果审核之类的会有麻烦,还是后端支持https会比较好,应该是必须支持https