iOS_网络编程
2015-09-23 19:32
701 查看
网络编程中有以下几种方式向服务器进行提交数据:
IOS同步请求、异步请求、GET请求、POST请求
1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,
2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;
4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
接下来借用代码来演示四种请求方式的实现:
第一种是使用:GET请求方式
第二种是使用:POST请求方式
第三种是使用:同步请求方式
第四种是使用:异步请求方式
在使用NSURLConnection连接对象时,还需要实现<NSURLConnectionDataDelegate>代理方法
在POST请求方式中,如果希望看到数据传输的进度,可以通过实现以下方法进行打印输出。
知识点补充:GET请求和POST请求方式
GET
GET的语义是获取指定URL上的资源
将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
不安全,因为在传输过程中,数据被放在请求的URL中
传输的数据量小,这主要是因为受URL长度限制
POST
POST的语意是对指定资源“追加/添加”数据
将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
所有数据对用户来说不可见
可以传输大量数据,上传文件只能使用Post
网络访问的四个步骤
第一步:确定地址——URL
第二步:建立请求
第三步:开始连接
等待网络处理中……
第四步:连接完成,处理结果
IOS同步请求、异步请求、GET请求、POST请求
1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,
2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;
4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
接下来借用代码来演示四种请求方式的实现:
第一种是使用:GET请求方式
-(void)loginByGet { //1.创建NSURL对象,设计连接的地址 NSString *strURL =[NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; /** * NSURLReqest 如果是不可变的,则不可设置超时时间。 */ //3.创建NSURLConnection连接对象 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; //4.向服务器发送请求 [connection start]; }
第二种是使用:POST请求方式
-(void)loginByPost { //1.创建NSURL对象,设计连接的地址 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:5.0];//设置连接超时的等待时间; [request setHTTPMethod:@"post"];//设置请求方式为POST //设置post带的数据 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; //通过协议头进行携带数据 [request setHTTPBody:dataBody]; //3.创建NSURLConnection连接对象 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; //向服务器发送请求 [conn start]; }
第三种是使用:同步请求方式
-(void)loginByPost { //1.创建NSURL对象,设计连接的地址 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:5.0];//超时时间 [request setHTTPMethod:@"post"];//设置使用post方式 //设置post带的数据 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; //通过协议头进行携带数据 [request setHTTPBody:dataBody]; //3.创建NSURLConnection连接对象 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; //4.向服务器发送请求 [conn start]; //清理数据 NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding]; [self.allDatas setData:data]; }
第四种是使用:异步请求方式
-(void)asyncLogin { //1.创建NSURL对象,设置连接的地址 NSString *strURL = @"http://127.0.0.1//userManager/login.php"; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象(POST) NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //设置请求方式 [request setHTTPMethod:@"POST"]; //在异步请求方式中,通过协议体进行携带数据传送 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSData *data = [strBody dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:data]; //3.创建异步请求 //block将代码进行封装,作为一个参数加到这个方法中,当数据传输完成之后,才调用block进行输出。当调用block时,将接收到的服务器响应、数据,还有出错信息,传送到block中,进行判断输出。 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError) { NSLog(@"Error reason:%@",connectionError); } else { //设置编码 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); //将从服务器收到的数据进行输出 NSString *request = [[NSString alloc]initWithData:data encoding:encoding]; NSLog(@"%@",request); } }]; }
在使用NSURLConnection连接对象时,还需要实现<NSURLConnectionDataDelegate>代理方法
#pragma mark - NSURLConnection代理方法 //收到服务器返回的数据,可能会执行很多次,因为数据如果很大的话,会进行分包发送 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //将所有数据段进行拼接,将新接收的数据段进行追加 [self.allDatas appendData:data]; } //连接过程中出错处理 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"error reason:%@",error); } //数据接收完毕,做最后的数据处理 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { //当传输的文件中,如果含有汉字的,系统无法识别这种编码 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); //按照encoding这种编码方式,将接收到数据段进行输出 NSString *request = [[NSString alloc]initWithData:self.allDatas encoding:encoding]; NSLog(@"%@",request); }
在POST请求方式中,如果希望看到数据传输的进度,可以通过实现以下方法进行打印输出。
//以post方式传数据时返回数据传输的进度,仅限于以post方式 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite); }
知识点补充:GET请求和POST请求方式
GET
GET的语义是获取指定URL上的资源
将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
不安全,因为在传输过程中,数据被放在请求的URL中
传输的数据量小,这主要是因为受URL长度限制
POST
POST的语意是对指定资源“追加/添加”数据
将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
所有数据对用户来说不可见
可以传输大量数据,上传文件只能使用Post
网络访问的四个步骤
第一步:确定地址——URL
第二步:建立请求
第三步:开始连接
等待网络处理中……
第四步:连接完成,处理结果
相关文章推荐
- IOS开发-第三方SDWebImage下载网络图片的使用
- Android中 Http请求
- 陈硕 - Linux 多线程服务端编程 - muduo 网络库作者
- uva 10054 The Necklace(欧拉回路)
- 网络字节序和主机字节序
- [网络流] HDOJ 5457 Hold Your Hand
- 第十四章:网络编程
- RTCP
- HTTP POST GET 本质区别详解
- 高性能网络编程7--tcp连接的内存使用
- centosxxx + redhat5.5 快速设置网络源
- 安卓Imageview控件如何获取网络图片
- TCP/IP协议三次握手与四次握手流程解析
- SSL,TLS,IPSec 和HTTPS
- 转虚拟机配置Centos 网络
- HTTPS(SSL/TLS) 原理之深入浅出
- 查看linux server网络I/0流量的shell脚本
- 卷积神经网络Convolutional Neural Networks
- 通用js函数集锦<来源于网络> 【二】
- 一只简单的网络爬虫(基于linux C/C++)————Url处理以及使用libevent进行DNS解析