• iOS_网络编程


    网络编程中有以下几种方式向服务器进行提交数据:
    IOS同步请求、异步请求、GET请求、POST请求

    1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,

    2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行

    3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;

    4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
     
    接下来借用代码来演示四种请求方式的实现:
    第一种是使用:GET请求方式
     1 -(void)loginByGet
     2 {
     3     //1.创建NSURL对象,设计连接的地址
     4     NSString *strURL =[NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
     5     NSURL *url = [NSURL URLWithString:strURL];
     6     
     7     //2.创建NSURLRequest请求对象
     8     NSURLRequest *request = [NSURLRequest requestWithURL:url];
     9     /**
    10      *  NSURLReqest 如果是不可变的,则不可设置超时时间。
    11      */
    12     //3.创建NSURLConnection连接对象
    13     NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    14 
    15     //4.向服务器发送请求
    16     [connection start];
    17 }

    第二种是使用:POST请求方式

     1 -(void)loginByPost
     2 {
     3     //1.创建NSURL对象,设计连接的地址
     4     NSString *strURL = @"http://127.0.0.1/userManager/login.php";
     5     NSURL *url = [NSURL URLWithString:strURL];
     6     
     7     //2.创建NSURLRequest请求对象
     8     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
     9     [request setTimeoutInterval:5.0];//设置连接超时的等待时间;
    10     [request setHTTPMethod:@"post"];//设置请求方式为POST
    11     //设置post带的数据
    12     NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
    13     NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];
    14     //通过协议头进行携带数据
    15     [request setHTTPBody:dataBody];
    16     
    17     //3.创建NSURLConnection连接对象
    18     NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    19     
    20     //向服务器发送请求
    21     [conn start];
    22     
    23 }

    第三种是使用:同步请求方式

     1 -(void)loginByPost
     2 {
     3     //1.创建NSURL对象,设计连接的地址
     4     NSString *strURL = @"http://127.0.0.1/userManager/login.php";
     5     NSURL *url = [NSURL URLWithString:strURL];
     6     //2.创建NSURLRequest请求对象
     7     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
     8     [request setTimeoutInterval:5.0];//超时时间
     9     [request setHTTPMethod:@"post"];//设置使用post方式
    10     //设置post带的数据
    11     NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
    12     NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];
    13     //通过协议头进行携带数据
    14     [request setHTTPBody:dataBody];
    15     
    16     //3.创建NSURLConnection连接对象
    17     NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    18     //4.向服务器发送请求
    19     [conn start];
    20     
    21     //清理数据
    22     NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding];
    23     [self.allDatas setData:data];
    24     
    25 }

     第四种是使用:异步请求方式

     1 -(void)asyncLogin
     2 {
     3     //1.创建NSURL对象,设置连接的地址
     4     NSString *strURL = @"http://127.0.0.1//userManager/login.php";
     5     NSURL *url = [NSURL URLWithString:strURL];
     6     
     7     //2.创建NSURLRequest请求对象(POST)
     8     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
     9     //设置请求方式
    10     [request setHTTPMethod:@"POST"];
    11     //在异步请求方式中,通过协议体进行携带数据传送
    12     NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];
    13     NSData *data = [strBody dataUsingEncoding:NSUTF8StringEncoding];
    14     [request setHTTPBody:data];
    15     //3.创建异步请求
    16     //block将代码进行封装,作为一个参数加到这个方法中,当数据传输完成之后,才调用block进行输出。当调用block时,将接收到的服务器响应、数据,还有出错信息,传送到block中,进行判断输出。
    17     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    18         if (connectionError) {
    19             NSLog(@"Error reason:%@",connectionError);
    20         }
    21         else
    22         {
    23             //设置编码
    24             unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    25             //将从服务器收到的数据进行输出
    26             NSString *request = [[NSString alloc]initWithData:data encoding:encoding];
    27             NSLog(@"%@",request);
    28         }
    29     }];
    30 }

    在使用NSURLConnection连接对象时,还需要实现<NSURLConnectionDataDelegate>代理方法

     1 #pragma mark - NSURLConnection代理方法
     2 //收到服务器返回的数据,可能会执行很多次,因为数据如果很大的话,会进行分包发送
     3 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
     4 {
     5     //将所有数据段进行拼接,将新接收的数据段进行追加
     6     [self.allDatas appendData:data];
     7 }
     8 //连接过程中出错处理
     9 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    10 {
    11     NSLog(@"error reason:%@",error);
    12 }
    13 //数据接收完毕,做最后的数据处理
    14 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    15 {
    16     //当传输的文件中,如果含有汉字的,系统无法识别这种编码
    17     unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    18     //按照encoding这种编码方式,将接收到数据段进行输出
    19     NSString *request = [[NSString alloc]initWithData:self.allDatas encoding:encoding];
    20     NSLog(@"%@",request);
    21 }

    在POST请求方式中,如果希望看到数据传输的进度,可以通过实现以下方法进行打印输出。

    1 //以post方式传数据时返回数据传输的进度,仅限于以post方式
    2 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
    3 {
    4     NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite);
    5 }
     
    知识点补充:GET请求和POST请求方式

    GET

    1. GET的语义是获取指定URL上的资源
    2. 将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
    3. 不安全,因为在传输过程中,数据被放在请求的URL中
    4. 传输的数据量小,这主要是因为受URL长度限制

    POST

    1. POST的语意是对指定资源“追加/添加”数据
    2. 将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
    3. 所有数据对用户来说不可见
    4. 可以传输大量数据,上传文件只能使用Post
    网络访问的四个步骤
    • 第一步:确定地址——URL
    • 第二步:建立请求
    • 第三步:开始连接

    等待网络处理中……

    • 第四步:连接完成,处理结果
  • 相关阅读:
    机器学习:K-近邻分类
    集体智慧编程2:聚类算法(分级聚类和K-均值聚类)(以博客的聚类为例,附有获取数据的代码)
    机器学习简介
    集体智慧编程1:推荐算法(基于协作性过滤collaborative filtering)(实例加代码)
    图片轮播
    A页面调到B页面,B页面关闭时A页面刷新
    css 上下滚动效果
    js数组的sort排序详解
    查看机器上安装的jdk能支持多大内存
    from表单如果未指定action,submit提交时候会执行当前url
  • 原文地址:https://www.cnblogs.com/xjf125/p/4833318.html
Copyright © 2020-2023  润新知