iOS开发网络篇—NSURLConnection基本使用

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 一、NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体.... (3)NSMutableURLRequest:NSURLRequest的子类 (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。

一、NSURLConnection的常用类

(1)NSURL:请求地址

(2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....

(3)NSMutableURLRequest:NSURLRequest的子类

(4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

 

二、NSURLConnection的使用
1.简单说明

使用NSURLConnection发送请求的步骤很简单

(1)创建一个NSURL对象,设置请求路径(设置请求路径)

(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

(3)使用NSURLConnection发送NSURLRequest(发送请求)

2.代码示例

(1)发送请求的三个步骤:

1.设置请求路径
2.创建请求对象
3.发送请求
3.1发送同步请求(一直在等待服务器返回数据,这行代码会卡住,如果服务器,没有返回数据,那么在主线程UI会卡住不能继续执行操作)有返回值
3.2发送异步请求:没有返回值
说明:任何NSURLRequest默认都是get请求。
 
(2)发送同步请求代码示例:
复制代码
 1 //
 2 //  YYViewController.m
 3 //  01-NSURLConnection的使用(GET)
 4 //
 5 //  Created by apple on 14-6-28.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "MBProgressHUD+MJ.h"
11 
12 @interface YYViewController ()
13 @property (weak, nonatomic) IBOutlet UITextField *username;
14 @property (weak, nonatomic) IBOutlet UITextField *pwd;
15 - (IBAction)login;
16 
17 @end
18 
19 @implementation YYViewController
20 
21 - (IBAction)login {
22 //    1.提前的表单验证
23     if (self.username.text.length==0) {
24         [MBProgressHUD showError:@"请输入用户名"];
25         return;
26     }
27     if (self.pwd.text.length==0) {
28         [MBProgressHUD showError:@"请输入密码"];
29         return;
30     }
31 //    2.发送请求给服务器(带上账号和密码)
32     //添加一个遮罩,禁止用户操作
33 //    [MBProgressHUD showMessage:@"正在努力加载中...."];
34 //    GET请求:请求行\请求头\请求体
35 //
36 //    1.设置请求路径
37     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
38     NSURL *url=[NSURL URLWithString:urlStr];
39 //    2.创建请求对象
40     NSURLRequest *request=[NSURLRequest requestWithURL:url];
41 //    3.发送请求
42     //发送同步请求,在主线程执行
43     NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
44     //(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
45     NSLog(@"--%d--",data.length);
46 }
47 @end
复制代码

模拟器情况:

打印服务器返回的信息:

补充说明:
1.提前的表单验证
2.发送请求给服务器(带上账号和密码)
GET请求:请求行\请求头\请求体
注意:GET请求中不存在请求体,因为所有的信息都写在URL里面。在IOS里面,请求行和请求头都不用写。
 
(3)发送异步请求
发送异步请求有两种方式:
1)使用block回调
2)代理
A.使用block回调方法发送异步请求
使用block回调代码示例:
复制代码
 1 //
 2 //  YYViewController.m
 3 //  01-NSURLConnection的使用(GET)
 4 //
 5 //  Created by apple on 14-6-28.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "MBProgressHUD+MJ.h"
11 
12 @interface YYViewController ()
13 @property (weak, nonatomic) IBOutlet UITextField *username;
14 @property (weak, nonatomic) IBOutlet UITextField *pwd;
15 - (IBAction)login;
16 
17 @end
18 
19 @implementation YYViewController
20 
21 - (IBAction)login {
22 //    1.提前的表单验证
23     if (self.username.text.length==0) {
24         [MBProgressHUD showError:@"请输入用户名"];
25         return;
26     }
27     if (self.pwd.text.length==0) {
28         [MBProgressHUD showError:@"请输入密码"];
29         return;
30     }
31 //    2.发送请求给服务器(带上账号和密码)
32     //添加一个遮罩,禁止用户操作
33     [MBProgressHUD showMessage:@"正在努力加载中...."];
34 
35 //
36 //    1.设置请求路径
37     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
38     NSURL *url=[NSURL URLWithString:urlStr];
39     
40 //    2.创建请求对象
41     NSURLRequest *request=[NSURLRequest requestWithURL:url];
42     
43 //    3.发送请求
44     //3.1发送同步请求,在主线程执行
45 //    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
46     //(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
47     
48     //3.1发送异步请求
49     //创建一个队列(默认添加到该队列中的任务异步执行)
50 //    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
51     //获取一个主队列
52     NSOperationQueue *queue=[NSOperationQueue mainQueue];
53     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
54         NSLog(@"--block回调数据--%@---%d", [NSThread currentThread],data.length);
55         //隐藏HUD,刷新UI的操作一定要放在主线程执行
56         [MBProgressHUD hideHUD];
57         
58         //解析data
59         /*
60         {"success":"登录成功"}
61         {"error":"用户名不存在"}
62         {"error":"密码不正确"}
63          */
64         NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
65         NSLog(@"%@",dict);
66         
67         //判断后,在界面提示登录信息
68         NSString *error=dict[@"error"];
69         if (error) {
70             [MBProgressHUD showError:error];
71         }else
72         {
73             NSString *success=dict[@"success"];
74             [MBProgressHUD showSuccess:success];
75         }
76     }];
77     NSLog(@"请求发送完毕");
78 }
79 @end
复制代码

模拟器情况(注意这里使用了第三方框架):

打印查看:

代码说明:
block代码段:当服务器有返回数据的时候调用会开一条新的线程去发送请求,主线程继续往下走,当拿到服务器的返回数据的数据的时候再回调block,执行block代码段。这种情况不会卡住主线程。
队列的作用:决定这个block操作放在哪个线程执行?
刷新UI界面的操作应该放在主线程执行,不能放在子线程,在子线程处理UI相关操作会出现一些莫名的问题。
提示:
(1)创建一个操作,放在NSOperation队列中执行,默认是异步执行的。
(2)mainqueue   返回一个和主线程相关的队列,即主队列。
 
新的问题:如果向服务器发送请求,却并没有拿到数据,那么程序会崩溃(data不能为空)
改进代码:
复制代码
 1  NSOperationQueue *queue=[NSOperationQueue mainQueue];
 2     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
 3         //当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败)
 4         NSLog(@"--block回调数据--%@---%d", [NSThread currentThread],data.length);
 5         //隐藏HUD,刷新UI的操作一定要放在主线程执行
 6         [MBProgressHUD hideHUD];
 7         
 8         //解析data
 9         /*
10         {"success":"登录成功"}
11         {"error":"用户名不存在"}
12         {"error":"密码不正确"}
13          */
14         if (data) {//请求成功
15             NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
16             NSLog(@"%@",dict);
17             
18             //判断后,在界面提示登录信息
19             NSString *error=dict[@"error"];
20             if (error) {
21                 [MBProgressHUD showError:error];
22             }else
23             {
24                 NSString *success=dict[@"success"];
25                 [MBProgressHUD showSuccess:success];
26             }
27         }else   //请求失败
28         {
29             [MBProgressHUD showError:@"网络繁忙,请稍后重试!"];
30         }
31      
32     }];
复制代码
解析data
   //解析data
        /*
        {"success":"登录成功"}
        {"error":"用户名不存在"}
        {"error":"密码不正确"}
         */
说明:使用NSJSONSerialization 返回的对象,取决于最外层是什么,如果是{}那就是字典,[]那就是数组等。
补充说明:
首先确定请求路径,然后创建请求对象(默认发送的时get请求),使用异步方法(一调用这个方法,它会自动开启一个子线程去发送请求,当请求成功,数据返回的时候自动调用内部的代码段,这个代码段在那个线程执行取决于队列,如果是主队列,那么在子线程发送请求成功拿到服务器的数据后,回到主线程中解析数据,刷新UI界面)。
 
B.使用代理方法发送异步请求

要监听服务器返回的data,所以使用<NSURLConnectionDataDelegate>协议

常见大代理方法如下:

复制代码
 1 #pragma mark- NSURLConnectionDataDelegate代理方法
 2 
 3 //当接收到服务器的响应(连通了服务器)时会调用
 4 
 5 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 6 
 7 //当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
 8 
 9 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
10 
11 //当服务器的数据加载完毕时就会调用
12 
13 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
14 
15 //请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
16 
17 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
复制代码

使用异步方法发送get请求的代码示例:

 

复制代码
  1 //
  2 //  YYViewController.m
  3 //  01-NSURLConnection的使用(GET)
  4 //
  5 //  Created by apple on 14-6-28.
  6 //  Copyright (c) 2014年 itcase. All rights reserved.
  7 //
  8 
  9 #import "YYViewController.h"
 10 #import "MBProgressHUD+MJ.h"
 11 
 12 @interface YYViewController ()<NSURLConnectionDataDelegate>
 13 @property (weak, nonatomic) IBOutlet UITextField *username;
 14 @property (weak, nonatomic) IBOutlet UITextField *pwd;
 15 @property(nonatomic,strong)NSMutableData *responseData;
 16 - (IBAction)login;
 17 
 18 @end
 19 
 20 @implementation YYViewController
 21 
 22 - (IBAction)login {
 23 //    1.提前的表单验证
 24     if (self.username.text.length==0) {
 25         [MBProgressHUD showError:@"请输入用户名"];
 26         return;
 27     }
 28     if (self.pwd.text.length==0) {
 29         [MBProgressHUD showError:@"请输入密码"];
 30         return;
 31     }
 32 //    2.发送请求给服务器(带上账号和密码)
 33     //添加一个遮罩,禁止用户操作
 34     [MBProgressHUD showMessage:@"正在努力加载中...."];
 35 
 36 //
 37 //   2.1设置请求路径
 38     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
 39     NSURL *url=[NSURL URLWithString:urlStr];
 40     
 41 //   2.2创建请求对象
 42 //    NSURLRequest *request=[NSURLRequest requestWithURL:url];//默认就是GET请求
 43     //设置请求超时
 44     NSMutableURLRequest *request=[NSMutableURLRequest  requestWithURL:url];
 45     request.timeoutInterval=5.0;
 46     
 47 //   2.3.发送请求
 48  //使用代理发送异步请求(通常应用于文件下载)
 49     NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
 50     [conn start];
 51     NSLog(@"已经发出请求---");
 52 }
 53 
 54 #pragma mark- NSURLConnectionDataDelegate代理方法
 55 /*
 56  *当接收到服务器的响应(连通了服务器)时会调用
 57  */
 58 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 59 {
 60     NSLog(@"接收到服务器的响应");
 61     //初始化数据
 62     self.responseData=[NSMutableData data];
 63 }
 64 
 65 /*
 66 *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
 67 */
 68 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 69 {
 70     NSLog(@"接收到服务器的数据");
 71     //拼接数据
 72     [self.responseData appendData:data];
 73         NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]);
 74 }
 75 
 76 /*
 77  *当服务器的数据加载完毕时就会调用
 78  */
 79 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
 80 {
 81     NSLog(@"服务器的数据加载完毕");
 82     //隐藏HUD
 83     [MBProgressHUD hideHUD];
 84     
 85     //处理服务器返回的所有数据
 86     NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];
 87     
 88     //判断后,在界面提示登录信息
 89     NSString *error=dict[@"error"];
 90     if (error) {
 91         [MBProgressHUD showError:error];
 92     }else
 93     {
 94         NSString *success=dict[@"success"];
 95         [MBProgressHUD showSuccess:success];
 96     }
 97     NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]);
 98 }
 99 /*
100  *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
101  */
102 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
103 {
104 //     NSLog(@"请求错误");
105     //隐藏HUD
106     [MBProgressHUD hideHUD];
107     [MBProgressHUD showError:@"网络繁忙,请稍后重试!"];
108 }
109 @end
复制代码

 

打印查看:

 

补充:

(1)数据的处理

在didReceiveData:方法中,拼接接收到的所有数据,等所有数据都拿到后,在connectionDidFinishLoading:方法中进行处理

(2)网络延迟

在做网络开发的时候,一定要考虑到网络延迟情况的处理,可以在服务器的代码设置一个断点模拟。

在服务器代码的登录方法中设置断点

设置请求的最大延迟

 

模拟器情况:

打印查看:

三、NSMutableURLRequest

NSMutableURLRequest是NSURLRequest的子类,常用方法有

设置请求超时等待时间(超过这个时间就算超时,请求失败)- (void)setTimeoutInterval:(NSTimeInterval)seconds;

设置请求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;

设置请求体- (void)setHTTPBody:(NSData *)data;

设置请求头- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

 

转:http://www.cnblogs.com/wendingding/p/3813572.html

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
5天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
3天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
5天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
17 5
|
5天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
17 5
|
5天前
|
开发工具 Android开发 Swift
探索安卓与iOS开发的差异:从新手到专家的旅程
在数字时代的浪潮中,移动应用开发已成为连接世界的桥梁。本文将深入探讨安卓与iOS这两大主流平台的开发差异,带领读者从零基础出发,逐步了解各自的特点、开发环境、编程语言及市场策略。无论你是梦想成为移动应用开发者的初学者,还是希望扩展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议。
|
6天前
|
人工智能 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术
在移动应用开发的广阔天地里,安卓和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台的开发环境、工具及市场趋势,帮助开发者在选择适合自己项目的平台时做出更明智的决策。通过比较各自的优势与局限,我们不仅能更好地理解每个系统的核心特性,还能洞察未来技术发展的脉络。无论你是刚入行的新手还是资深开发者,这篇文章都将为你提供有价值的参考和启示。
19 5
|
6天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:一场操作系统的较量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同海上的两艘巨轮,各自承载着不同的使命与梦想。本文将深入浅出地探讨这两个系统在开发领域的异同,从用户体验、开发工具、市场趋势等多个维度进行比较分析。通过这场技术的较量,我们可以更好地理解每个系统的优势与局限,以及它们如何影响我们的日常生活和工作。
|
5天前
|
Linux Android开发 iOS开发
探索Android与iOS开发:平台之战还是互补共生?
在移动应用开发的浩瀚宇宙中,Android和iOS这两大星系始终吸引着无数开发者的目光。它们各自拥有独特的引力场,引领着技术潮流的方向。本文将穿梭于这两个平台的星际空间,揭示它们背后的力量对比,以及如何在这两者之间找到平衡点,共同推动移动应用开发的进步。
14 1
|
5天前
|
移动开发 开发框架 Android开发
安卓与iOS开发:平台之战的新篇章
在移动应用开发的广阔天地中,安卓和iOS始终占据着主导地位。本文通过比较这两个平台的发展历程、技术特点及未来趋势,探讨了它们之间的竞争与合作。文章旨在为开发者提供一个清晰的平台选择指南,并预测未来移动开发的可能走向。
11 1
|
10天前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。