[iOS]AFNetworking使用遇到的问题总结
2016-01-14 22:21
441 查看
1. The data couldn’t be read because it isn’t in the correct format
最近一个项目,在请求接口时,一直有问题,使用get请求可以正常请求到数据,而post则无法获取数据
控制台输出:
使用Charles抓包会发现是这样的信息:
400 Bad Request!
我一看是非法的网络请求,以为是我的问题,就一直在我这边找原因,最后才发现,这是因为我发送请求时发送的字符串,和后台需要的字符串格式不一致,发送请求时,后台需要的是text文本格式,而我发送的是json格式,导致后台无法识别,接收不到数据!
后来发现我所用的封装类里的请求头,有如下设置:
把第二个注释掉,即使用默认的Content-Type,
并在发送请求时设置发送的字段为文本格式,即:
最后不得已使用原生的AFNetworking进行测试,post正常拿到了数据,后来对比两者的区别,除了上面的改动以外,请求返回的数据也要改为文本,即:
这样才正常拿到了数据!!
总之,此次网络请求的异常,是由于请求和响应的文本格式没有统一,导致参数无法正常传递,数据无法正常读取!不过,竟然不知json传输,我也是醉了...
2. Invalid parameter not satisfying: body
在使用AFNetworking进行传图操作的时候,出现了这个crash信息:
模拟器运行后控制台输出:
真机的话会输出如下信息:
而且crash的地方也不一样:
模拟器crash到自动释放池
真机的话carsh到AFN的底层:
其实,最主要的信息就是:Invalid parameter not satisfying: body (无效的参数:body)
问题就出在body这个参数上,模拟器上看不出什么头绪,请求参数中也没有body这个参数;但是在真机上的crash信息可以看出一些头绪:他是crash到了这个方法里
可以看到body的类型是NSData,而设置的请求参数中,只有要发送的照片数据是NSData类型,是不是照片的问题呢?进到AFN的底层可以发现,AFN上传图片主要是用到了这个方法:
在这个方法里调用了
正是,程序crash的地方;
其实,打断点调试后也能发现传入的照片数据为nil,问题的根源找到了,问题也就解决了!!!
最近一个项目,在请求接口时,一直有问题,使用get请求可以正常请求到数据,而post则无法获取数据
控制台输出:
http://192.168.69.121:8080/artboss-webapp/ios/checkcode params:{ "user_phonenumber" = 185****0925; } errorInfos:The data couldn’t be read because it isn’t in the correct format.大意就是数据格式不对,无法读取!后台也接收不到我传递的参数;
使用Charles抓包会发现是这样的信息:
HTTP Status 400 - Request String parameter 'user_phonenumber' is not present
400 Bad Request!
我一看是非法的网络请求,以为是我的问题,就一直在我这边找原因,最后才发现,这是因为我发送请求时发送的字符串,和后台需要的字符串格式不一致,发送请求时,后台需要的是text文本格式,而我发送的是json格式,导致后台无法识别,接收不到数据!
后来发现我所用的封装类里的请求头,有如下设置:
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];即,默认是使用json传输数据的!
把第二个注释掉,即使用默认的Content-Type,
并在发送请求时设置发送的字段为文本格式,即:
manager.requestSerializer = [AFHTTPRequestSerializer serializer];本以为会解决问题,但事实还是请求不到数据!!
最后不得已使用原生的AFNetworking进行测试,post正常拿到了数据,后来对比两者的区别,除了上面的改动以外,请求返回的数据也要改为文本,即:
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
这样才正常拿到了数据!!
总之,此次网络请求的异常,是由于请求和响应的文本格式没有统一,导致参数无法正常传递,数据无法正常读取!不过,竟然不知json传输,我也是醉了...
2. Invalid parameter not satisfying: body
在使用AFNetworking进行传图操作的时候,出现了这个crash信息:
模拟器运行后控制台输出:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: body' *** First throw call stack: ( 0 CoreFoundation 0x0000000107ad4e65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000106c1edeb objc_exception_throw + 48 2 CoreFoundation 0x0000000107ad4cca +[NSException raise:format:arguments:] + 106 3 Foundation 0x000000010431d4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198 ) libc++abi.dylib: terminating with uncaught exception of type NSException
真机的话会输出如下信息:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: body' *** First throw call stack: (0x225e62eb 0x21db2dff 0x225e61c1 0x22dbcd3b 0x1b8d3f 0x1b8981 0x1909f1 0x1b4a6b 0x1a1be9 0x1906c1 0x176535 0x177171 0x193371 0x18f5cb 0x19fbb9 0x8dfcbf 0x8dfcab 0x8e4771 0x225a8fc5 0x225a74bf 0x224f9bb9 0x224f99ad 0x23773af9 0x267e5fb5 0x118b11 0x221ac873) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
而且crash的地方也不一样:
模拟器crash到自动释放池
真机的话carsh到AFN的底层:
其实,最主要的信息就是:Invalid parameter not satisfying: body (无效的参数:body)
问题就出在body这个参数上,模拟器上看不出什么头绪,请求参数中也没有body这个参数;但是在真机上的crash信息可以看出一些头绪:他是crash到了这个方法里
- (void)appendPartWithHeaders:(NSDictionary *)headers body:(NSData *)body { NSParameterAssert(body); AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; bodyPart.stringEncoding = self.stringEncoding; bodyPart.headers = headers; bodyPart.boundary = self.boundary; bodyPart.bodyContentLength = [body length]; bodyPart.body = body; [self.bodyStream appendHTTPBodyPart:bodyPart]; }
可以看到body的类型是NSData,而设置的请求参数中,只有要发送的照片数据是NSData类型,是不是照片的问题呢?进到AFN的底层可以发现,AFN上传图片主要是用到了这个方法:
- (void)appendPartWithFileData:(NSData *)data name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType { NSParameterAssert(name); NSParameterAssert(fileName); NSParameterAssert(mimeType); NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; [self appendPartWithHeaders:mutableHeaders body:data]; }
在这个方法里调用了
[self appendPartWithHeaders:mutableHeaders body:data];
正是,程序crash的地方;
其实,打断点调试后也能发现传入的照片数据为nil,问题的根源找到了,问题也就解决了!!!
相关文章推荐
- iOS合理利用Local Push和Long-running background task
- iOS中类似九宫格排版数据
- 关于在ios 中断言的使用
- 最佳图片处理框架SDWebImage的使用
- iOS 真机调试
- IOS程序开发中-跳转到 发送短信界面 实现发短信
- iOS-制作Framework
- iOS CoreData的使用和简介
- iOS label自适应高度(宽度)
- iOS 实现毛玻璃效果
- ios蓝牙使用
- iOS 程序清理缓存调用
- ios中处理时间是否是今天,昨天,今年
- (转载)关于delegate 与 protocol 的理解 iOS
- 编写高质量iOS代码的方法总结
- IOS-事件处理
- iOS应用内购买之应用下载
- iOS应用生命周期相关内容
- 【iOS开发】runtime机制
- 委托/代理模式(iOS版)