你的位置:首页 > 操作系统

[操作系统]iOS网络请求基础


  这篇是关于网络请求的,结合公司的实际情况编写,如果有不同意见欢迎留言共同讨论。

  iOS在9.0之后彻底放弃了NSURLConnection,现在已经改用了NSURLSession进行网络请求。一般现在网络请求也都是使用AFNetworking。下面就把我自己关于afn和系统的api使用写下来。

  一.使用NSURLSession

  移动端的网络请求主要是get请求和post请求, get和post请求步骤差不多,只不过post对于信息的传送更安全,post请求会设置body而且会对body进行加密,保证传输的信息安全。

      NSString *urlString = BASE_PERSONAL_URL; // 设置请求网址
    NSURL *url = [NSURL URLWithString:urlString];
      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 创建请求

    // 参数拼接
      NSDictionary *bodyDic = @{@"password": md5Password, @"os": @"2", @"version": strSysVersion, @"models": phoneModel};
      NSArray *body = @[bodyDic];
      NSDictionary *parameter = @{@"head":head, @"body":body};
      request.HTTPMethod = @"Post"; // 设置请求方式
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // 设置请求头,返回类型
        NSLog(@"parameter ==== %@", parameter);
        
        NSData *data = [NSJSONSerialization dataWithJSONObject:parameter options:NSJSONWritingPrettyPrinted error:nil];
        // 因为需要对body体进行加密所以先把data转化成字符串,如果不加密可略过次步
        NSString *bodyString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSData *bodyData = [[Base getHTTPBodyString:bodyString] dataUsingEncoding:NSUTF8StringEncoding]; // 对body体进行加密
    request.HTTPBody = bodyData; // 设置body体
    // 进行网络请求
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error) {
            
            // 因为回传的信息也进行了加密所以也需要对返回的数据进行解密
            // 将data数据转化成字符串进行解密
            NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSString *resault = [Base getHttpString:responseString];
            // 将解密后的字符串转成data
            NSData *resaultData = [resault dataUsingEncoding:NSUTF8StringEncoding];
            // 使用json解析
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:resaultData options:NSJSONReadingMutableLeaves error:nil];
      
        } else {
            NSLog(@"%@", error);
        }
    }];

  // 网络请求开始
    [dataTask resume];

 请求方面基本是这样的,至于加密的方式是公司内部协商确定的

 二 使用AFN

      AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    
    [sessionManager POST:urlString parameters:parameter progress:^(NSProgress * _Nonnull uploadProgress) {
    
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        
        NSLog(@"response === %@", responseObject);

        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"data ====---0=-=0=0-=0=0-=0= %@", error);

    }];
    一般公司会根据实际情况对afn进行二次封装,而不会直接调用afn的接口,比如说加密等