iOS学习--网络基础

Get & Post请求

•网络访问的四个步骤

–地址

–请求

–连接

–处理结果

•iOS网络处理常用类

–NSURL(地址)

–NSRequest[GET]& NSMutableURLRequest[POST](请求)

–NSConnection(连接)

•实现NSURLConnectionDataDelegate代理方法可以接收服务器响应数据(处理结果)

关于代理的方法:

•代理方法存在的问题

–代理方法较多,比较分散

–要处理一个请求,需要在很多地方编写代码

–不利于逻辑实现、代码编写、调试、维护以及扩展

–尤其当存在多个请求时会变得非常麻烦!

•已经学习过的代理方法

–UIApplicationDelegate

–UITableViewDelegate、UITableViewDataSource

–UITextFieldDelegate

–通过协议自定义代理方法

–NSURLConnectionDataDelegate

同步和异步请求:

•NSURLConnection提供了两个静态方法可以直接同步或异步调用NSURLRequest,而无需通过NSURLConnectionDataDelegate获取数据

•同步请求:

sendSynchronousRequest:request returningResponse:&response error:&error

•异步请求:

sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

有关主操作队列的内容,在多线程课程讲解

缓存策略:

•NSURLRequest的cachePolicy属性可以设置缓存策略,这是一种内存缓存,非硬盘缓存

•使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,使程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求

•cachePolicy支持的缓存策略包括:

–NSURLRequestUseProtocolCachePolicy 默认的缓存策略,要在协议的实现方法中指定缓存逻辑

–NSURLRequestReloadIgnoringCacheData 忽略缓存从原始地址下载

–NSURLRequestReturnCacheDataElseLoad 没有缓存时从原始地址下载

–NSURLRequestReturnCacheDataDontLoad 只使用缓存,如果不存在缓存,请求失败,适用于没有建立网络连接离线模式

–NSURLRequestReloadIgnoringLocalAndRemoteCacheData 忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似

–NSURLRequestReloadRevalidatingCacheData 验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据

同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。

从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的:

1、创建NSURL

2、创建Request对象

3、创建NSURLConnection连接。

NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。

(今天学习关于网络的基础,代码有一些重复,缓存策略还没有学习)

下面是get和post方式的代码:

#pragma mark - 测试get方式
-(IBAction)getLogin:(UIButton *)btn
{
    static NSString * loginUrl =@"http://192.168.1.102:8080/IOSApplication/LoginServletController.do";

    //初始化数据
    _receiveDate = [NSMutableData data];

    //定义URL
    NSString * urlStr = [NSString stringWithFormat:@"%@?username=%@&password=%@",loginUrl,_userName.text,_password.text];

    // 注意:网络请求的URL,需要编码才可以使用!!!_
    NSURL *url = [NSURL URLWithString:urlStr];

    //// 定义请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //定义连接
    NSURLConnection *cont = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [cont start];
}

#pragma mark - 网络连接错误判断
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"网络连接错误%@",error.localizedDescription);
}

#pragma mark - 接收响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"开始接收的响应");
}

#pragma mark - 收到数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"收到服务器返回的数据:%@",data);

    [_receiveDate appendData:data];
}

#pragma mark - 连接结束
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *backString = [[NSString alloc]initWithData:_receiveDate encoding:NSUTF8StringEncoding];
    NSLog(@"结束接收的数据 %@",backString);

    _receiveDate = nil;
}

#pragma mark - 测试post方式
-(IBAction)postLogin:(UIButton *)btn
{

    static NSString * loginUrl =@"http://192.168.1.102:8080/IOSApplication/LoginServletController.do";

    //初始化数据
    _receiveDate = [NSMutableData data];

    // 定义URL,字母及数字组成的url不需要编码
    NSURL * url = [NSURL URLWithString:loginUrl];

    //定义请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //等待服务器响应时间5
    [request setTimeoutInterval:5.0];

    //设置请求方式
    [request setHTTPMethod:@"post"];

    NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userName.text,_password.text];

    //生成请求数据并编码
    NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

    // 设置HTTP请求数据体,NSMutableURLRequest会自动在请求头中加入Content-Length
    [request setHTTPBody:body];

    //设置连接
    NSURLConnection *cont = [[NSURLConnection alloc]initWithRequest:request delegate:self];

    //开始连接
    [cont start];

}

#pragma mark - 发送数据给服务器,POST请求使用此方法
- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    NSLog(@"发送数据给服务器 bytesWritten: %ld, totalBytesWritten %ld totalBytesExpectedToWrite %ld", bytesWritten,totalBytesWritten,totalBytesExpectedToWrite);
}

下面是同步和异步(NSURLConnection提供了两个静态方法可以直接同步或异步调用NSURLRequest,而无需通过NSURLConnectionDataDelegate获取数据)

//生成post请求
-(NSMutableURLRequest *)postLoginRequest
{

    static NSString * loginUrl =@"http://192.168.1.102:8080/IOSApplication/LoginServletController.do";

    //初始化数据
    _receiveDate = [NSMutableData data];

    // 定义URL,字母及数字组成的url不需要编码
    NSURL * url = [NSURL URLWithString:loginUrl];

    //定义请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //等待服务器响应时间5
    [request setTimeoutInterval:5.0];

    //设置请求方式
    [request setHTTPMethod:@"post"];

    NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userName.text,_password.text];

    //生成请求数据并编码
    NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

    // 设置HTTP请求数据体,NSMutableURLRequest会自动在请求头中加入Content-Length
    [request setHTTPBody:body];

    return request;

}

#pragma mark - post 同步方式登录
-(IBAction) synchronizationLogin:(UIButton *)btn
{
    NSMutableURLRequest *request = [self postLoginRequest];
    NSError *error;
    NSURLResponse *response;

    NSDate * date = [NSURLConnection  sendSynchronousRequest:request returningResponse:&response error:&error];

    // 注意,只有同步请求结束之后,才会执行后续操作,修改LOGIN_URL可以看到效果
    if (!date) {
        NSLog(@"同步访问错误:%@",error.localizedDescription);
    }
    else{
        //解码数据
        NSString *string = [[NSString alloc]initWithData:date encoding:NSUTF8StringEncoding];
        NSLog(@"同步数据 %@",string);
    }

}

#pragma mark - post 异步方式登录
-(IBAction)asynchronizationLogin:(UIButton *)btn
{
    NSMutableURLRequest *request = [self postLoginRequest];

    // 注意此处使用了块代码!异步请求队列使用的是操作队列的主队列
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        if([data length]>0 && connectionError==nil)
        {
            NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"异步成功返回的数据%@",string);
        }
        else if ([data length] <=0 && connectionError==nil)
        {

            NSLog(@"没有接收到返回数据");
        }
        else
        {
            NSLog(@"异步访问错误%@",connectionError.localizedDescription);
        }
    }];
}
时间: 2024-12-21 08:17:29

iOS学习--网络基础的相关文章

Android基础入门教程——7.6.1 Socket学习网络基础准备

Android基础入门教程--7.6.1 Socket学习网络基础准备 标签(空格分隔): Android基础入门教程 本节引言: 为了照顾没学过Java Socket的初学者,或者说捋一捋Android开发中涉及到的网络协议相关的概念, 毕竟面试的时候,面试官来了句给我说下网络协议有几层?那么IP协议在哪层?Socket是什么鬼? 分哪几种?TCP和UDP协议又在哪层?有什么区别-嗯,这-所以学习本节概念性的理论还是很有 必要的!那么话不多说,开始本节内容~ 1.OSI七层网络模型浅析 当然,

iOS学习之基础控件

一.UILabel 1.UILabel(标签):是显示文本的空间.在App中UILabel是出现频率最高的控件. 2.UILabel是UIView的子类,作为子类一般是为了扩充父类的功能UILabel扩展了文字显示的功能,UILabel是能显示文字的视图. 3.创建UILabel 1 // 创建UILabel对象 2 UILabel *userNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 100, 100, 30)]; 3 4

IOS学习笔记 -- 基础MVC初学习

1. @property的参数说明ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制使用ARC机制,对象的申请和释放工作会在运行时,由编译器自动在代码中添加retain和release1> strong:强指针引用的对象,在生命周期内不会被系统释放 在OC中,对象默认都是强指针2> weak:弱指针引用的对象,系统会立即释放 弱指针可以指向其他已经被强指针引用的对象 @property参数使用小结:1> 控件用weak2> 属性对象用strong3> 非对象类型用

[ios学习]零基础学习iOS开发如何分配时间

在培训期间,学生的时间应该如何分配 学生在学习期间的主要工作时间分配 9:00~ 9:30,认真听同学的学习阶段中的分享,俗话说的好"三人行,必有我师"; 9:30~ 18:00,认真听老师的课堂上课,并且要准备好一个手写笔记本,好记性不如烂笔头,当然我个人认为记录在电脑上,并不靠谱,而且在复习时还费眼,我从开始上学到现在就一直有在笔记本上写写画画的习惯; 19:00~ 20:00,用一个小时的时间,回忆今天上课的知识点,这时笔记本的重要性就体现了,它可以帮助我们心无旁骛的复习和总结;

linux学习 --- 网络基础知识

1.1  IP地址 IP地址由两部分组成  网络号和主机号 .网络号为IP地址的高位组成,而主机号是IP地址的低位组成,两个的大小取决于网络的类型. IP地址根据网络的地址不同分为:A类,B类,C类,D类,E类. (1)A类IP地址类型 A类IP地址由一个字节的网络号和三个字节的主机号组成.网络地址的最高位必须为“0”,地址范围为:1.0.0.0 到 126.0.0.0. (2)B类IP地址类型 B类IP地址由两个字节的网络号和两个字节的主机号组成.网络地址的最高位必须为“10”,地址范围为:1

IOS学习笔记 -- 基础-疯狂猜图实现流程

1. 搭建界面1> 上半部分,固定的,可以用Storyboard实现2> 下半部分,根据题目变化,可以考虑用代码实现 2. 图片的放大缩小1> 放大过程(1) 增加蒙版(遮罩),蒙版默认alpha = 0(2) 将图片移动到视图的顶层 [self.view bringSubviewToFront:图片的view];(3) 计算图片的目标位置,将蒙版的alpha改为0.5,动画显示 2> 缩小过程(1) 恢复图片位置,动画显示(2) 隐藏蒙版,将蒙版的默认alpha改为0 提示:如果

IOS学习笔记 -- 基础

1.在OC中,不允许直接修改"对象"的"结构体属性"的"成员变量",但是允许修改"对象"的"结构体属性" 修改结构体属性的成员变量方法如下: 1> 使用临时变量记录对象的结构体属性2> 修改临时变量的属性3> 将临时变量重新赋值给对象的结构体属性 2. 在程序开发中需要避免出现魔法数字(Magic Number)使用枚举类型,可以避免在程序中出现魔法数字 1> 枚举类型实质上就是一个

网络基础知识查询

第一章.基础网络概念 1.1 网络是个什么玩意儿 全世界的人种有很多,人类使用的语言种类也多的很.那如果你想要跟外国人沟通时,除了比手划脚之外,你要如何跟对方讲话? 大概只有两种方式啰,一种是强迫他学中文,一种则是我们学他的语言,这样才能沟通啊.在目前世界上的强势语言还是属于英语系国家, 所以啰,不管是啥人种,只要学好英文,那么大家都讲英文,彼此就能够沟通了.希望不久的未来,咱们的中文能够成为强势语言啊! 这个观念延伸到网络上面也是行的通的,全世界的操作系统多的很,不是只有 Windows/Li

鸟哥的私房菜的网络基础篇,好久没看了,重新看了一下子网划分简单很多

第二章.基础网络概念 目录 第二章.基础网络概念 1 2.1 网络是个什么玩意儿 2 2.1.1 什么是网络 2 2.1.2 计算机网络组成组件 5 2.1.3 计算机网络区域范围 6 2.1.4 计算机网络协议: OSI 七层协定 7 2.1.5 计算机网络协议: TCP/IP 11 2.2 TCP/IP 的链结层相关协议 12 2.2.1 广域网使用的设备 13 2.2.2 局域网络使用的设备-以太网络 14 2.2.3 以太网络的传输协议:CSMA/CD 16 2.2.4 MAC 的封装格