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

  • 时间:
  • 出处:跟我学网络
  • 作者:
  • 浏览:704

标签:ios   app   xcode   url   网络编程   http   

从本篇文章开始,介绍一些网络开发中用到的技术。

iOS的网络开发中,特别是应用开发,使用Http协议作为主要的通信手段

写代码前,先了解一些与协议相关联的内容,包括:

    URL的概念

    HTTP与HTTPS

    HTTP请求的内容及请求对象

    HTTP应答的内容及请求对象



  • URL

URL:统一资源标示符,可以表示一个资源的路径,这个路径可以是本地的、网络上的。

URL是对可以从互联网上得到的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。


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

    650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7C/B1/wKiom1bWVqijmTNGAABYnXG1MSE239.png" title="屏幕快照 2016-03-02 上午10.57.58.png" alt="wKiom1bWVqijmTNGAABYnXG1MSE239.png" />


NSURL是Objective-C中用于描述URL信息的对象类型,通常使用一个字符串创建

+ (instancetype)URLWithString:(NSString *)URLString


URL的编码问题

   URL中不允许出现特殊编码及中文字符,如果出现需要转换为%编码形式

下面的NSString分类方法,提供对URL格式的处理。

    650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7C/AF/wKioL1bWWB-AqY1NAACyntsbotk827.png" title="屏幕快照 2016-03-02 上午11.02.08.png" alt="wKioL1bWWB-AqY1NAACyntsbotk827.png" />


  • 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/请求的抓包数据

    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/7C/B1/wKiom1bWV_yjMA9MAAEDSDKmElg808.png" title="屏幕快照 2016-03-02 上午11.03.35.png" alt="wKiom1bWV_yjMA9MAAEDSDKmElg808.png" />


包含三部分:请求行、请求头、请求体

请求行:包含了请求类型、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) :


    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/7C/B1/wKiom1bWWw2AKHqAAABb88r53sM298.png" title="屏幕快照 2016-03-02 上午11.16.38.png" width="349" height="83" border="0" hspace="0" vspace="0" style="width:349px;height:83px;" alt="wKiom1bWWw2AKHqAAABb88r53sM298.png" />

    请求参数(urlParam) :

 


    650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/7C/B0/wKioL1bWW6XBV0_LAADBXOIT3NA985.png" title="屏幕快照 2016-03-02 上午11.17.02.png" width="550" height="257" border="0" hspace="0" vspace="0" style="width:550px;height:257px;" alt="wKioL1bWW6XBV0_LAADBXOIT3NA985.png" />


1)请求头(header参数)

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

    650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7C/B0/wKioL1bWXBfxB7PRAABzCRJFrbM490.png" title="屏幕快照 2016-03-02 上午11.19.05.png" alt="wKioL1bWXBfxB7PRAABzCRJFrbM490.png" />


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),如:

    650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/7C/B0/wKioL1bWXMuw4mKTAABJqK4GaBA371.png" title="屏幕快照 2016-03-02 上午11.21.39.png" alt="wKioL1bWXMuw4mKTAABJqK4GaBA371.png" />


  • HTTP应答(响应)的内容

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

    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/7C/B1/wKiom1bWXN3geGZRAAEra5N3WsM790.png" title="屏幕快照 2016-03-02 上午11.24.26.png" alt="wKiom1bWXN3geGZRAAEra5N3WsM790.png" />


应答报文包括三部分:状态行、消息报头、应答数据

     状态行:状态码描述应答状态

     消息报头:和请求头类似,可以包含一系列字段,如响应的数据类型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类型包括:视频、图像、文本、音频、应用程序等等,如:

    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/7C/B0/wKioL1bWXZryIejvAAG5vGIZyr8491.png" title="屏幕快照 2016-03-02 上午11.25.34.png" alt="wKioL1bWXZryIejvAAG5vGIZyr8491.png" />

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


  • 应答的数据

一个网络请求,通常可以获得三个数据:

  1. 应答对象(NSHTTPURLResponse)

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

  3. 响应数据(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



本文出自 “安萌” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1746659