iOS---网络基础一

来源:互联网 发布:samba的端口号 编辑:程序博客网 时间:2024/06/02 00:37


一、访问网络的方式

1、同步请求:数据的请求过程是在主线程来执行的。网络数据加载需要一个时间过程,这样的话就会堵塞主线程。

2、异步请求:数据的请求过程在多线程来执行。

3、同步请求无法取消,异步请求过程中可以取消。同步请求无法监听加载进度,异步可以监听。

二、访问网络的基本流程

1、第一步:确定地址——URL
2、第二步:建立请求
3、第三步:建立并启动连接

等待网络处理中……


4、第四步:连接完成,处理结果

5、接受返回数据


三、向HTTP服务器发送请求

•有两种方法把数据提交给服务器:GET和POST
GET
GET的语义是获取指定URL上的资源
–将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
–不安全,因为在传输过程中,数据被放在请求的URL中
–传输的数据量小,这主要是因为受URL长度限制
POST
POST的语意是对指定资源“追加/添加”数据
–将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
–所有数据对用户来说不可见
–可以传输大量数据,上传文件只能使用Post


1,get 所有参数接接在URL后面,路径如果包含了中文等字符,需要进行转码

转码的代码

string=[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


2,POST

参数不拼接在URL后面 ,

参数放在请求体里面(body),参数包含了中文,还是需要转码

四、 异步\同步请求

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

sendSynchronousRequest:requestreturningResponse:&responseerror:&error


NSMutableURLRequest*request = [selfpostLoginRequest];

   NSError*error;

   NSURLResponse*response;

   

   NSData*data = [NSURLConnectionsendSynchronousRequest:requestreturningResponse:&responseerror:&error];

   

   //注意,只有同步请求结束之后,才会执行后续操作,修改LOGIN_URL可以看到效果

     if (!data){

        NSLog(@"同步访问错误:%@", error.localizedDescription);

   } else {

        // 解码数据

             NSString *string= [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

       

        NSLog(@"同步返回内容:%@",string);

    }


•异步请求:

sendAsynchronousRequest:requestqueue:[NSOperationQueuemainQueue]completionHandler:^(NSURLResponse*response,NSData*data,NSError*error)

NSMutableURLRequest*request = [selfpostLoginRequest];

// 注意此处使用了块代码!异步请求队列使用的是操作队列的主队列

[NSURLConnectionsendAsynchronousRequest:requestqueue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse*response,NSData*data,NSError*error) {

   if([data length]> 0&& error == nil) {

        // 解码数据

            NSString *string= [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

       

        NSLog(@"异步返回内容:%@",string);

   } else if([data length]<= 0&& error == nil) {

        NSLog(@"没有接收到返回数据");

   } else {

        NSLog(@"异步访问错误:%@", error.localizedDescription);

   }

}];


五、用设置代理的方法  

默认就是代理方法

NSURLConnection *conn=[NSURLConnection connectionWithRequest:<#(NSURLRequest *)#> delegate:self];

[connstart]


实现代理方法:接收服务器返回的数据,并且解析数据

1,接收到服务器的响应,服务器要传数据,客户端做接收准备

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

2接收到服务器的数据时就会调用 一次,(能会调用多次);

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

3 请求结束(数据完毕)就会调用,做后续处理

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

4服务器请求失败,原因很多。

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

5向服务器发送数据,此方法仅适用于POST,尤其文件文件

(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite

六、缓存策略

NSURLRequest *re=[NSURLRequest requestWithURL:<#(NSURL *)#> cachePolicy:<#(NSURLRequestCachePolicy)#> timeoutInterval:<#(NSTimeInterval)#>]


•NSURLRequest的cachePolicy属性可以设置缓存策略,这是一种内存缓存,非硬盘缓存
•使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,使程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求
•cachePolicy支持的缓存策略包括:
NSURLRequestUseProtocolCachePolicy默认的缓存策略,要在协议的实现方法中指定缓存逻辑
NSURLRequestReloadIgnoringCacheData忽略缓存从原始地址下载
NSURLRequestReturnCacheDataElseLoad没有缓存时从原始地址下载
NSURLRequestReturnCacheDataDontLoad只使用缓存,如果不存在缓存,请求失败,适用于没有建立网络连接离线模式
NSURLRequestReloadIgnoringLocalAndRemoteCacheData忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似
NSURLRequestReloadRevalidatingCacheData验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据




定义request

NSMutableURLRequest*request = [NSMutableURLRequest requestWithURL:url];
// 等待服务器响应的最长时间
•[requestsetTimeoutInterval:5.0];
// 设置请求方法,大小写无关
•[request setHTTPMethod:@"post"];
•NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userNameText.text,_passwordText.text];
// 生成请求体数据并编码
•NSData *body = [bodyStringdataUsingEncoding:NSUTF8StringEncoding];
// 设置HTTP请求数据体
•[request setHTTPBody:body];




0 0