网络处理1-异步GET请求
前言
云计算
近几年来,云计算是一个非常热门的技术名词,很多专家认为,云计算会改变互联网的技术基础,甚至会影响整个产业的格局。可能还很多人不了解什么是云计算,简单来说,就是把用户的数据(比如文档、照片等)、用户需要使用的软件、用户需要搜索的资源都保存在"云端",并不用保存在用户本地。你可以将"云端"看做了一台超级计算机,其实是由无数台大型服务器组成的。
移动应用
现在很多的移动应用也类似于"云计算"的模式,比如新浪微博,用户的数据都是保存在新浪服务器的数据库里面。当用户想在手机上看到自己的微博数据时,大致需要以下几个过程:
1.新浪微博手机客户端发送HTTP请求到新浪服务器
2.服务器响应后返回数据给客户端
3.客户端对数据进行解析后以图形界面的形式(如列表形式)呈现给用户
网络处理这一块在移动开发中占据着非常重要的地位,我们这个专题主要来学习iOS网络处理中的HTTP请求。
一、API简介
如果你想在iOS中发送Http请求的话,有很多方式可以选择,我在这里介绍几个常见的:
1.苹果自带的API
1> Core Foundation框架中的CFNetwork API:纯C语言的API,性能非常高
2> Foundation框架中的NSURLConnection API:Objective-C的API,性能也不错,简单易用
2.第3方开源框架
2> AFNetworking
我们这个专题主要来研究NSURLConnection的使用,至于第3方框架的学习,网上也有很多资源可以搜索。
二、发送异步的GET请求
众所周知,HTTP的主要请求方式有2种:GET请求和POST请求,接下来先演示下如何发送一个GET请求。
需要注意的是,你最好发送一个异步请求,不要发送同步请求。iOS程序启动后,系统会默认创建一条主线程,也称为UI线程,这条主线程专门用来渲染UI界面、处理UI界面和用户之间的交互,比如处理用户的触摸事件、文本输入事件等。所谓异步请求,就是在后台线程发送请求,不在主线程发送请求。一般情况下,客户端发出请求后,需要等待服务器的数据返回,如果服务器处理速度比较慢或者网速慢的话,可能要等很长时间。因此,如果你执意要发送同步请求,也就是在主线程发送请求,会造成主线程阻塞,容易出现卡机现象,给用户带来极差的体验。
1.利用NSURLConnection发送异步请求

1 // 请求地址
2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123";
3
4 // 初始化一个NSURL对象
5 NSURL *url = [NSURL URLWithString:urlString];
6
7 // 初始化一个请求
8 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
9 // 设置请求方法,可以省略,默认就是GET请求
10 request.HTTPMethod = @"GET";
11 // 如果60秒过后服务器还没有相应,就算请求超时
12 request.timeoutInterval = 60;
13
14 // 初始化一个连接
15 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
16 // 开始一个异步请求
17 [conn start];

1> 第2行的是请求地址,由于是GET请求,请求参数是直接拼接到路径后面的
2> 第17行调用NSURLConnection的start方法发送一个HTPP请求,默认就是异步请求
2.NSURLConnectionDataDelegate
在前面的第15行代码中,初始化NSURLConnection对象的时候传了个self做代理(delegate),我这里的self是控制器。在客户端跟服务器交互过程会不断地给这个代理对象发送消息,也就是会不断地调用代理对象的相应方法。iOS在NSURLConnectionDataDelegate协议中定义了很多代理方法,我这里只介绍常用的3个方法:

1 #pragma mark - NSURLConnectionDataDelegate
2 #pragma mark 接收到服务器返回的数据时调用(如果数据比较多,这个方法可能会被调用多次)
3 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
4 NSLog(@"接收到服务器返回的数据");
5 // 拼接数据
6 [self.data appendData:data];
7 }
8
9 #pragma mark 网络连接出错时调用
10 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
11 NSLog(@"网络连接出错:%@", [error localizedDescription]);
12 }
13
14 #pragma mark 服务器的数据已经接收完毕时调用
15 - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
16 NSLog(@"服务器的数据已经接收完毕");
17 // 解析成字符串数据
18 NSString *str = [[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding] autorelease];
19 NSLog(@"%@", str);
20 }

1> 当服务器有数据返回时就会调用第3行的代理方法,返回的数据以NSData的格式传入。如果数据比较多,比如下载大文件时,这个方法可能会被调用多次。
2> 第6行用一个NSMutableData对象拼接服务器返回的所有数据,self.data是一个NSMutableData。
3> 当服务器已经成功返回所有的数据后,会调用第15行的代理方法,到此为止,self.data里面存放着服务器端返回的所有数据
4> 由于我这边服务器返回的是JSON字符串数据,所以在18行将self.data转换为NSString,然后打印出来看看数据对不对
3.对中文参数进行编码
如果你的请求参数中含有中文,必须先进行编码,然后再拼接到请求路径后面。
下面的请求路径写法是错误的:
1 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=母鸡";
应该这样写:

1 // 使用UTF-8对中文参数进行编码
2 NSString *param = [@"母鸡" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
3
4 // 请求地址
5 NSString *baseUrl = @"http://192.168.1.102:8080/MJServer/login?username=";
6 NSString *urlString = [baseUrl stringByAppendingString:param];

1> 第2行使用UTF-8对中文参数进行编码
2> 在第6行拼接编码后的参数到请求路径中
4.取消请求
如果用户的网络状况不是很好,那么在登录的过程中,用户很可能会点击"取消"按钮来取消登录
当用户点击了取消按钮,我们也应该终止之前发送的请求,这时候可以这样做
[conn cancel];
conn是一个NSURLConnection对象
网络处理1-异步GET请求的更多相关文章
- Java网络编程中异步编程的理解
目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...
- Android网络框架OkHttp之get请求(源码初识)
概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...
- Android系列之网络(二)----HTTP请求头与响应头
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- jmeter 异步子请求测试随笔
好久没写技术类的博客了,都不知道自己都在忙啥.... 最近陆续遇到了一些异步子请求的测试需求,比如打开某一个页面A,A页面里的js会再调用B,C,D,E等请求,针对这个页面的测试,我最近做了一些思考: ...
- 网络处理2-异步POST请求和同步请求
一.异步POST请求 假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个: username :母鸡 pwd :123 1.POST请求细节 ...
- Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...
- jquery.ajax异步发送请求的简单测试
使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...
- JavaScript异步并发请求问题
JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题
- 基于netty的异步http请求
package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...
随机推荐
- ios coreData使用
ios中的coredata的使用(转) 分类: ios2013-07-15 18:12 27288人阅读 评论(1) 收藏 举报 Core Data数据持久化是对SQLite的一个升级,它是ios集成 ...
- 多线程 -- GCD
GCD中有2个核心概念 任务:执行什么操作 队列:用来存放任务 执行任务 同步方法: dispatch_sync dispatch_sync(dispatch_queue_t queue, dispa ...
- git创建分支并提交项目
git 创建分支, 切换分支, 合并分支, 删除分支及提交[commit提交到本地仓库push名利提交到远程服务器], 检出[pull], 冲突修改, 本地仓库同步远程服务器[pul和push命令l] ...
- EF之外键Include() left join
项目中用EF实现外键查询出的数据, 查询数量正确, 但实现返回数据集数量不对 //DbContext.cs HasRequired(s => s.ClassRoom) .WithMany() . ...
- Java团队项目总结
Java团队项目总结 1.项目实现情况 项目概述: 我们团队项目准备实现一个有关于大富翁有的游戏程序. 大富翁游戏,以经营权为主要的游戏方式,通过购买经营权与架构经营的星级服务来获得最大的利益,当其他 ...
- android手机配置hosts文件
Android设备测试服务器时,可能需要修改 hosts 文件指定域名到对应的 IP 地址.Android 是基于 Linux 的系统,与 Linux 类似,通过 hosts 文件来设置. 在 And ...
- mp3 切割
开源的东东很不错,摘了一段好文: 常在听mp3或其他格式音乐的朋友,有时会有特别喜欢的片段,例如副歌的部份会想拿来做手机的铃声.这时候就需要一些处理音效的软体,例如之前提过的 Audacity.其实还 ...
- Poj 1904 King's Quest 强连通分量
题目链接: http://poj.org/problem?id=1904 题意: 有n个王子和n个公主,王子只能娶自己心仪的公主(一个王子可能会有多个心仪的公主),现已给出一个完美匹配,问每个王子都可 ...
- 【Python】代码调试(pdb与logging使用)
一.pdb使用 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 ...
- JS--事件对象中部份浏览器不兼容方法
测试时主要用的浏览器是Firefox 28.0.IE11.IE8.Chrome 34.0 一.什么是事件对象:当触发某个事件的时候,会产生一个事件对象,这个对象包含着所有的与事件有关的信息,包括导致 ...