GET和POST请求不到数据
在项目中遇到一个bug:
- 就是请求的参数和代码那些都是对的,和安卓的也比较了,但是安卓的可以请求到数据,但是我就是请求不到数据,而且不仅仅是GET,POST也请求不到。
- 但是用原来的老域名也可以请求成功,但是新域名就是请求不成功,后来经过很久的摸索和请教,终于找到问题所在。
那就是和域名有关,所以就和AFNetworking有关,在AFSecurityPolicy类中加上self.validatesDomainName = YES;
这么一句代码,即要对证书中的domain这一个字段进行校验。因为我们后台好像对域名做了一些操作,所以必须要加上这句代码才能请求到数据。
详细了解可以看这篇文章 正确使用AFNetworking的SSL保证网络安全
只是POST请求不到数据
虽然前面的问题解决了,而后在项目中又遇到了一个非常诡异的bug,那就是我的POST请求总是不成功,而安卓的却可以,我们传的参数等等都是一样一样的,后来经过我换了各种POST请求方式,都不成功,确定代码没有问题。
后来和后台,再和安卓多方面沟通,才知道安卓POST请求参数传的是josn格式的,而我传的参数是字典格式的,所以我们两个的格式不一样,后台的两个判断中,我传的那种格式的判断没有通过。所以当确定自己这边没有问题过后,一定要和后台那边多沟通进行解决,因为有的问题不是你一个人就能解决掉的。
字典实质就是一对对key-value的键值对,一般的传到后台后,都统一转化为josn格式,老项目一般转化为XML格式,方便查询编程。
另外当网络请求异常的时候,我们可以这样来进行分析:
1、在AFURLSessionManager类里面的
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data
{
//接受数据(网络原始数据)
// NSLog(@"网络原始数据:%s", [data bytes]);
AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask];
[delegate URLSession:session dataTask:dataTask didReceiveData:data];
if (self.dataTaskDidReceiveData) {
self.dataTaskDidReceiveData(session, dataTask, data);
}
}
方法中打印网络的原始数据。
2、如果没有收到数据,就往响应头那边查。
3、 一般有数据的, 异常的话 要么url有问题,要么参数有问题,要么https有问题, 这三个没问题,基本上都会有数据, 响应头数据不标准,会在完成的时候做处理,即这个方法:
- (void)URLSession:(__unused NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
4、关于HTTPS的方法:
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
5、关于响应头的方法,http会走这个方法,HTTPS只要查上面的方法就可以了
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler