前言

云计算

近几年来,云计算是一个非常热门的技术名词,很多专家认为,云计算会改变互联网的技术基础,甚至会影响整个产业的格局。可能还很多人不了解什么是云计算,简单来说,就是把用户的数据(比如文档、照片等)、用户需要使用的软件、用户需要搜索的资源都保存在"云端",并不用保存在用户本地。你可以将"云端"看做了一台超级计算机,其实是由无数台大型服务器组成的。

移动应用

现在很多的移动应用也类似于"云计算"的模式,比如新浪微博,用户的数据都是保存在新浪服务器的数据库里面。当用户想在手机上看到自己的微博数据时,大致需要以下几个过程:

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方开源框架

1> ASIHttpRequest

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请求的更多相关文章

  1. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  2. Android网络框架OkHttp之get请求(源码初识)

    概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...

  3. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. jmeter 异步子请求测试随笔

    好久没写技术类的博客了,都不知道自己都在忙啥.... 最近陆续遇到了一些异步子请求的测试需求,比如打开某一个页面A,A页面里的js会再调用B,C,D,E等请求,针对这个页面的测试,我最近做了一些思考: ...

  5. 网络处理2-异步POST请求和同步请求

    一.异步POST请求 假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个: username :母鸡 pwd :123 1.POST请求细节 ...

  6. Java利用httpasyncclient进行异步HTTP请求

    Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...

  7. jquery.ajax异步发送请求的简单测试

    使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...

  8. JavaScript异步并发请求问题

    JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题

  9. 基于netty的异步http请求

    package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...

随机推荐

  1. UIButton setImage setBackgoundImage

    setBackgroundImage 会根据button的大小平铺 setImage不会平铺

  2. 关于Objective-C格式化处理相关规范

    Objective-C格式字符串和C#有很大的差别,下面我们就来看看 在C#中我们可以这么做,简单例举几个: //格式化输出字符串 string word = "world"; s ...

  3. jQuery4ajax

    1.jQuery对ajax编程的支持 (1)load方法: 作用:将服务器返回的数据直接添加到符合要求的dom节点之上. 用法:load(url,[data]); url:请求地址,比如"p ...

  4. ActiveX控件的基本操作方法以及如何在VS2010下使用控件

    在此,小编就介绍下ActiveX控件的基本操作方法以及如何在VS2010下使用控件,我们以一个程序为例, (1)      打开VS2010编译器(右键以管理员身份运行,因为ActiveX需要注册), ...

  5. c++11并发程序设计(1)

    第一章:你好 c++的并发世界 1.何为并发 最简单和最基本的并发,是指两个或两个以上的独立活动同时进行. 对于单个处理单元或者核心,这种机器只能在某一时刻执行一个任务,不够它可以每秒进行多次的任务切 ...

  6. PHP图形图像处理之初识GD库

    d=====( ̄▽ ̄*)b 引语 php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF.PNG.JPEG.WBMP.XBM等. php还可以将图像流直接显示在浏览器中. 要处 ...

  7. web前端网页特效大全导航列表

    CSS3和Html5 图表与图形 表单验证 导航菜单 table选项卡 视频播放器 日期和时间 返回顶部 图层代码 滚动代码 幻灯片 文字特效 图片放大镜 juqery焦点图 瀑布流 广告悬浮代码 在 ...

  8. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

  9. ZOJ Monthly, July 2015

    B http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5552 输入n,表示有n个数1到n.A先拿,B后拿,依次拿,每次可以拿任意一 ...

  10. winform 记录全局异常捕获

    这篇文章主要是备用 记录winform程序捕获全局异常. /// <summary> /// 应用程序的主入口点. /// </summary> public static A ...