您的位置:首页 > 理论基础 > 计算机网络

iOS网络开发(1)写代码前需要了解的

2016-03-02 11:27 489 查看
从本篇文章开始,介绍一些网络开发中用到的技术。
iOS的网络开发中,特别是应用开发,使用Http协议作为主要的通信手段
写代码前,先了解一些与协议相关联的内容,包括:
URL的概念

HTTP与HTTPS

HTTP请求的内容及请求对象
HTTP应答的内容及请求对象

URL

URL:统一资源标示符,可以表示一个资源的路径,这个路径可以是本地的、网络上的。
URL是对可以从互联网上得到的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。

互联网上每一个文件都有唯一一个URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。




NSURL是Objective-C中用于描述URL信息的对象类型,通常使用一个字符串创建
+ (instancetype)URLWithString:(NSString *)URLString


URL的编码问题

URL中不允许出现特殊编码及中文字符,如果出现需要转换为%编码形式下面的NSString分类方法,提供对URL格式的处理。



HTTP 协议与HTTPS协议

HTTP:超文本传输协议(HyperText Transport Protocol),是互联网上广泛使用的一种网络协议。
设计的目的是为HTML页面提供发布和接受的方法,后来的发展,HTTP已经不局限于操作HTML。
目前的版本:HTTP 1.1,默认端口:80
HTTP协议,是C/S模型的标准TCP通信协议,通常服务器是网站,客户端是浏览器或者终端应用。

HTTPS:是在HTTP下加入了SSL层,用于安全的HTTP数据传输
默认端口:443
自XCode7开始,项目发送的网络请求必须发送HTTPS请求,要允许发送HTTP请求,需要:
在Info.plist文件中,添加NSAppTransportSecurity字段,类型为NSDictionary
字典中再添加NSAllowsArbitraryLoads字段,类型为Boolean,值为YES

HTTP请求的内容

如下:这是一个 http://www.baidu.com/请求的抓包数据



包含三部分:请求行、请求头、请求体
请求行:包含了请求类型、URL 、协议版本等信息

请求头:作为请求的参数,以 “字段名”:“字段值”
可以指定多个参数,其中Host字段是必须的
请求体:http的数据主体
通常对于Web浏览器而言,请求体是表单编码数据
通常对于移动端应用而言,请求体是XML或JSON格式的数据

Http请求类型
GET:获取内容,数据按照variable=value形式添加到URL的后面。
传输的数据在URL中不安全,传输的数据量受URL的长度限制。
POST:添加内容,将数据放在数据体中,数据对用户不可见
可以传输大量的数据,可以用来上传文件。
HEAD:请求首部,通常用于检查服务器最近内容的变化
PUT:发送请求(和POST类似),请求的URL存在则修改该旧版本,不存在则创建。
DELETE:请求删除资源,某些云服务上能用到。
其他请求:OPTIONS、TRACE

请求对象NSURLRequest

NSURLRequest是请求对象类型,请求对象通常由一个URL创建
+ (instancetype)requestWithURL:(NSURL *)theURL
+ (instancetype)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
第二个方法,可以指定:
1)请求的缓存策略(后面介绍)
2)请求时的超时时间防止请求无限等待

NSURLRequest对象的属性:
//URL属性
@property(readonly, copy) NSURL *URL
//Http请求类型:(默认是GET请求)
@property(readonly, copy) NSString *HTTPMethod
//Http请求体:
@property(readonly, copy) NSData *HTTPBody
//Http请求头:
@property(readonly, copy) NSDictionary *allHTTPHeaderFields
- (NSString *)valueForHTTPHeaderField:(NSString *)field


NSMutableURLRequest 可变请求对象

NSURLRequest是一个不可变类型,其子类NSMutableURLRequest可变类型
修改请求头、请求体通常需要使用这个可变类型
@property(copy) NSString *HTTPMethod
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
- (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field


请求的参数

通常请求的参数可以放在:
请求头
URL(GET请求)
请求体(POST请求)

如下面这个GET请求(药品搜索)
接口地址 :http://apis.baidu.com/tngou/drug/search 请求方法 :GET 请求参数(header) :




请求参数(urlParam) :







1)请求头(header参数)
通常放置非常重要或者涉及安全的参数,如上面例子中的apikey通常是一个字符串描述一个应用ID




2)URL(GET请求)
对于GET请求,通常将一些参数直接放在URL中,参数的形式如下: http://localhost/login.php?username=aaa&password=123 蓝色表示的是资源路径
红色的两个符号,?表示后面是urlParam,&是多个参数的分割
粉色的是参数,以key=value形式指定

3)请求体(POST请求)
对于POST请求,通常将参数放在请求体中,这样做的好处是:参数不会被暴漏在URL当中
参数格式通常是:
1)上面描述的格式如:username=aaa&password=123
2)JSON 3)XML ...

最多的情况就是1),如:




HTTP应答(响应)的内容

如下,是一个请求的应答报文的抓包数据




应答报文包括三部分:状态行、消息报头、应答数据
状态行:状态码描述应答状态
消息报头:和请求头类似,可以包含一系列字段,如响应的数据类型MIME type、数据长度等
响应数据:http的数据主体
对于Web浏览器通常是表单码数据;
对于移动端应用通常是JSON/XML数据

Http应答状态码

状态码由3位数字组成,第一个数字表示类型:
1xx:请求已接收,继续处理
2xx:成功
3xx:请求重定向
4xx:客户端错误,请求不能被服务器处理
5xx:服务器错误,服务器未能处理请求
常见的状态码:
200:OK,客户端请求成功
400:Bad Request,客户端的请求有语法错误
401:Unauthorized,未经授权的
403:Forbidden,服务器接受请求,但拒绝提供服务
404:Not Found,请求的资源不存在,URL错误
503:Server Unavailable,服务器当前不能处理请求

MIME type
Http应答的消息报头包含一个Content-type字段,表示应答中的数据类型
使用MIME(Multipurpose Internet Mail Extension) 多用途互联网邮件扩展
是一个互联网标准,最早应用于电子邮件,后来被应用到浏览器及终端引用程序
服务器通过该类型,告诉浏览器或终端应用程序发送的是什么类型的数据。
MIME类型包括:视频、图像、文本、音频、应用程序等等,如:



对于移动端开发,常用的:text/html text/plain text/json application/json ...

应答的数据

一个网络请求,通常可以获得三个数据:应答对象(NSHTTPURLResponse)

错误码(NSError,如果出错的话)

响应数据(NSData)

通常为JSON/XML

HTTP响应对象

NSURLResponse是应答报文类型,在移动端开发时,通常是由框架的方法返回
其常用属性有:
@property(readonly) long long expectedContentLength
@property(readonly, copy) NSString *suggestedFilename
@property(readonly, copy) NSString *MIMEType


通常我们使用的是NSURLResponse的子类NSHTTPURLResponse,表示一个Http应答报文类型

//消息报头
@property(readonly, copy) NSDictionary *allHeaderFields
//状态码:
@property(readonly) NSInteger statusCode
+ (NSString *)localizedStringForStatusCode:(NSInteger)statusCode
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS App Xcode