iOS联网方式

说明: 地址请查询API手册

iOS8以前的联网方式


同步请求

- (void) LoginButtonClicked:(UIButton *) sender{
    NSString *username = _uidField.text;
    NSString *password = _pwdField.text;
    // 文本框输入的信息作为参数传入
    NSString *urlStr = [NSString stringWithFormat:@"http://baidu.com/login.php?username=%@&password=%@",username,password];
    // 1.创建统一资源定位符
    NSURL *url = [NSURL URLWithString:urlStr];
    // 2.创建一个请求对象
    // 第一个参数:统一资源定位符
    // 第二个参数:缓存策略
    // 第三个参数:请求超时时间
    NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5];
    // 3.通过连接对象发送请求
    // 同步请求(返回NSData) - 阻塞式请求(代码会在此阻塞直到服务器完成响应或超时)
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];
    // 4.解析数据
    if (!error) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:1 error:nil];
        if ([dict[@"code"] isEqualToString:@"login_success"]) {
            NSLog(@"成功");
        }
        else{
            NSLog(@"失败");
        }
    }
    else{
        // 发生错误,打印错误日志
        NSLog(@"%@", error);
    }
}

异步请求

- (IBAction)registerButtonClicked:(UIButton *)sender {
    sender.enabled = NO;
    NSString *username = _uidField.text;
    NSString *password = _pwdField.text;
    NSString *email = _emailField.text;
    // 如果用户名有非ASCII字符需要转换成对应的百分号编码
    NSString *urlStr = [NSString stringWithFormat:@"http://baidu.com/login.php?username=%@&password=%@&email=%@",[username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], password, email];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5];
    // 异步请求(返回viod) - 非阻塞式请求(代码会往下执行 当收到服务器数据时通过block回调处理服务器返回的数据)
    // 第一个参数:请求对象
    // 第二个参数:操作队列(异步请求操作放在哪个队列中执行)
    // 第三个参数:Block回调(处理服务器返回数据)
    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if (!connectionError) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:1 error:nil];
            if ([dict[@"code"] isEqualToString:@"registered"]) {
                NSLog(@"成功");
            }
            else{
                NSLog(@"失败");
            }
        }
        else{
            // 发生错误,打印错误日志
            NSLog(@"%@",connectionError);
        }
        sender.enabled = YES;
    }];
}

NSURLConnection

- (void) loadUserInfo{
    NSString *urlStr = @"http://www.baidu.com";
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url cachePolicy:0 timeoutInterval:5];
    // 创建连接对象
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
    // 开始连接(该方法是异步请求)
    [conn start];
    
    // 取消连接
    //[conn cancel];
}
// 收到服务器响应的回调方法(只执行一次)
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    // 首先定义了一个NSMutableData *mData的成员变量
    if (!mData) {
        mData = [NSMutableData data];
    }
    else{
        // 清空所有数据
        mData.length = 0;
    }
}

// 收到服务器数据的回调方法(多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    // 提示:如果传输的数据量较大 该方法有可能会对此执行
    [mData appendData:data];
}

// 服务器数据传输完毕的回调方法(只执行一次)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    // 解析数据刷新视图
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:mData options:1 error:nil];
    GPUserInfo *userInfo = [[GPUserInfo alloc] init];
    [userInfo setValuesForKeysWithDictionary:dict];
}

NSURLSession

GET请求

使用NSURLSession发送GET请求方法:

  1. 确定请求路径,参数直接写在后面(?params1=123&params2=456)
  2. 创建请求对象NSURLRequest
  3. 创建会话对象NSURLSession
  4. 创建请求任务NSURLSessionDataTask
  5. 执行任务
  6. 数据处理

示例代码:

- (void) GETMethod{
    // 1.创建请求路径
    NSString *strUrl = @"http://servicebeta.cn/search/search_id?searchword=世界&appId=4c5c510f9f43aa";
    
    NSURL *url = [NSURL URLWithString:strUrl];
    // 2.创建一个网络请求
    NSURLRequest *request =[NSURLRequest requestWithURL:url];
    // 3.获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 4.根据会话对象,创建一个Task任务:
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error) {
            // 从服务器获取到的数据data进行相应的处理
            NSString *tempStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",tempStr);
        }
        else{
            // 数据请求失败处理
            NSLog(@"%ld %@",error.code, error.localizedDescription);
        }
    }];
    // 5.执行任务
    [dataTask resume];
    // 任务挂起(暂停)
    //[dataTask suspend];
    // 任务取消
    //[dataTask cancel];
}

POST请求

使用NSURLSession发送POST请求方法:

  1. 确定请求路径(这里不写?参数)
  2. 创建可变的请求对象NSMutableURLRequest
  3. 修改请求方法为POST(默认包含了请求头和请求方法GET,GET请求时此步骤省略)
  4. 设置请求体(GET请求时此步骤省略)
  5. 创建会话对象NSURLSession
  6. 创建请求任务NSURLSessionDataTask
  7. 执行任务
  8. 数据处理

示例代码:

- (void) POSTMethod{
    // 1.创建请求路径
    NSString *strUrl = @"http://servicebeta.cn/search/search_id";
    NSURL *url = [NSURL URLWithString:strUrl];
    
    // 2.创建一个网络请求, 并设置请求方法和请求参数
    NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5];
    request.HTTPMethod = @"POST";
    NSString *args = @"searchword=世界&appId=4c5c510f9f43aa";
    request.HTTPBody = [args dataUsingEncoding:NSUTF8StringEncoding];
    
    // 3.获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 4.根据会话对象,创建一个Task任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error) {
            // 从服务器获取到的数据data进行相应的处理
            NSString *tempStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",tempStr);
        }
        else{
            // 数据请求失败处理
            NSLog(@"%ld %@",error.code, error.localizedDescription);
        }
    }];
    // 5.执行任务
    [dataTask resume];
}

URLSession

@interface GPAlbumViewController (){
    // 所有的联网的配置都可以保存在该对象中
    // 该对象最好放到一个单例或者上下文中使其全局可见
    NSURLSessionConfiguration *config;
}

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 在这里设置config的属性

    // NSURLSessionConfig对象可以保存公共设置
    // 默认配置
    config = [NSURLSessionConfiguration defaultSessionConfiguration];
    // 创建一个无痕浏览的配置 不保存任何数据到保存
    //config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    // 创建一个后台运行的配置
    //config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"foo"];
    //config.HTTPAdditionalHeaders = @{@"apikey":@"你自己的key"};
    // 没电可以自动断开
    //config.discretionary = YES;
    
}
- (void)creatAlbum:(NSString *) name{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://baidu.com/create_album.php?albumname=%@&privacy=0",[name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
    // 通过NSURLSessionConfiguration对象创建NSURLSession对象
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (!error) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:1 error:nil];
            if ([dict[@"code"] isEqualToString:@"do_success"]) {
                NSLog(@"成功");
            }
            else{
                NSLog(@"失败");
            }
        }
        else{
            NSLog(@"%@",error);
        }
    }];
    // 执行任务
    [task resume];
}

AFNetworking

-(void) uploadphoto:(UIImage *) photoImage{
   
    NSDictionary *params = @{@"albumid":@(_albumId)};
    
    // 通过AFHTTPRequestSerializer对象创建请求对象
    // AFHTTPRequestSerializer对象创建请求的方法有五个参数:
    // 第一个参数: 设置请求方法(如果上传表单数据中如果有附件(二进制数据)必须使用POST请求)
    // 第二个参数: 统一资源定位符
    // 第三个参数: 提交给服务器的请求参数(表单中的参数)
    // 第四个参数: 提交给服务器的二进制数据(表单中的附件)
    // 第五个参数: NSError对象指针的指针
    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://baidu.com/upload_photo.php" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        // 通过UUID生成全局唯一的文件名
        NSString *filename = [NSString stringWithFormat:@"%@.png",[NSUUID UUID].UUIDString];
        // 将UIImage对象转成NSData对象(二进制数据)
        NSData *data = UIImagePNGRepresentation(photoImage);
        // 第一个参数:上传的二进制数据
        // 第二个参数:上传文件对应的参数名(通过查API手册获得)
        // 第三个参数:上传文件的文件名(这个名字通常没用,因为服务器通常会用自己的命名规则给上传的文件起名字来避免名字冲突)
        // 第四个参数:MIME类型(告知服务器上传的文件的类型)
        [formData appendPartWithFileData:data name:@"attach" fileName:filename mimeType:@"image/png"];
    } error:nil];
    
    // 通过会话配置对象创建AFNetworking的会话管理器对象
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[GPSNSContext sharedSNSContext].configure];
    // 表示完成进度的对象
    NSProgress *progress = nil;
    
    AFHTTPResponseSerializer *serializer = manager.responseSerializer;
    serializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/plain", nil];
    
    // 创建会话任务(获取数据任务、下载任务、上传任务)
    NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        
        if (!error) {
            hud.labelText = responseObject[@"message"];
            [hud hide:YES afterDelay:2];
        }
        else{
            NSLog(@"%@",error);
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            // 关闭网络活动指示器
            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        });
    }];
    
    // 在状态栏显示网络活动指示器
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    
    [uploadTask resume];
}
- (void) loadDataModel{
    if (!dataArray) {
        dataArray = [NSMutableArray array];
    }
    // 创建会话管理器对象(AFNetwoking提供的专门用于管理NSURLSession的对象)
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[GPSNSContext sharedSNSContext].configure];

    // 设置AFNetwork支持的响应内容的MIME类型
    // text/html - 超文本
    // text/plain - 纯文本
    // application/json - JSON
    // text/xml - XML
    // 有很多服务器在返回json数据的时候没有指定MIME类型是application/json类型 这样的话AFNetworking会报错 因为AFNetworking默认只支持application/json类型
    AFHTTPResponseSerializer *serializer = manager.responseSerializer;
    serializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/plain", nil];
    
    NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://baidu.com/photo_list.php?uid=%ld&id=%ld",[GPSNSContext sharedSNSContext].uid,_albumId]];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    
    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (!error) {
            for (NSDictionary *photoDict in responseObject[@"photos"]) {
                GPPicture *model = [GPPicture yy_modelWithDictionary:photoDict];
                [dataArray addObject:model];
            }
            // 这里要使用异步 如果使用dispatch_sync会卡
            dispatch_async(dispatch_get_main_queue(), ^{
                [myCollView reloadData];
            });
        }
        else {
            NSLog(@"Error: %@", error);
        }
    }];
    [dataTask resume];
}

iOS9访问http协议的URL需要修改配置文件

方法一:你可以在Info.plist 配置中添加或者修改XML源码:

xml.png

方法二:在 info.plist 文件中配置显示如下:

iOS9.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容