GET和POST请求不到数据,但是代码都是对的

GET和POST请求不到数据

在项目中遇到一个bug:

  1. 就是请求的参数和代码那些都是对的,和安卓的也比较了,但是安卓的可以请求到数据,但是我就是请求不到数据,而且不仅仅是GET,POST也请求不到。
  2. 但是用原来的老域名也可以请求成功,但是新域名就是请求不成功,后来经过很久的摸索和请教,终于找到问题所在。

那就是和域名有关,所以就和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

推荐阅读更多精彩内容