HTTP 协议 

1、是什么以及干什么用的

(1)超文本传输协议,目前1.1版本
(2)基于应用层的通信规范,规定客户端和服务器之间的数据传输格式
(3)iOS网络开发中,多用于进行发送HTTP请求

2、特点

(1)短连接,无状态连接(每次新建连接),通过TCP完成数据请求后立即释放。

(2)Keep-Alive 心跳包(1.1版本正式提供):

<0>如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,服务器收到请求时,会在响应头中添加一个同样的字段来使用Keep-Alive。客户端和服务器之间的HTTP连接就会被保持,不会断开,直到超时会或意外断开。
<1> 为了提高效率,使用心跳包,使得TCP短暂保持连接
<2> 时间可以设定,过期后仍然断开连接,所以HTTP还是短连接 
<3>使用session, Cookie等技术,也能保持用户的状态,但是每一次连接依然是无状态连接

(3)有请求才有回应,不请求不回应

(4)HTTP允许传输任意类型的数据

(5)简单快速,因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快

(6)采用短连接,一个连接处理一个请求,缩短数据请求和传输时间(0.9和1.0的特性,没有开启心跳包时)

3、OC中怎么使用

(1)使用http协议发送网络请求,http请求可以理解为特殊处理的socket
(2)HTTP请求格式:
 
      <1>请求行:  GET(请求方法) /resources/vedios.json(资源路径) HTTP/1.1(http协议版本)
 
      <2>请求头:  User-Agent (告诉服务器的一些数据)
 
       其他头信息:
             Accept: text/html // 客户端所能接收的数据类型
             Accept-Language: zh-cn // 客户端的语言环境
             Accept-Encoding: gzip // 客户端支持的数据压缩格式
             Host: m.baidu.com // 客户端想访问的服务器主机地址
             User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0 // 客户端的类型,客户端的软件环境
 
 
      <3> 请求体:  只有 POST 请求才有请求体 ,GET 请求是没有请求体的. 如果这个请求需要附带一些参数(通过参数告诉服务器返回什么数据),POST请求将参数封装在请求体中,GET请求直接将参数拼接在url中.

(3)http响应格式
      <1>响应行(状态行): HTTP/1.1(http协议版本) 304(网络连接状态码) Not Modified(网络连接状态码简要说明)
 
      <2>响应头: 会返回服务器信息,还会返回本次请求数据(实体内容)的信息。

其他头信息:
        Content-Encoding: gzip // 服务器支持的数据压缩格式
        Content-Length:  1528 // 返回数据的长度
        Content-Type:  application/xhtml+xml;charset=utf-8 // 返回数据的类型
        Date: Mon, 15 Jun 2015 09:06:46 GMT // 响应的时间
        Server: apache  // 服务器类型

       <3>实体内容: 就是客户端想要的数据。
  
(3)http请求方法
 
       <1>OC中没有针对HTTP请求格式做好的封装类,我们要手动封装
       <2>请求方法(不区分大小写):GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH 只用前两个
 
(tip:put操作是幂等性的,及重复操作只执行一个结果,而post不是
put的创建操作针对的是具体资源,及带有文件名的路径,而post不是,只要集合名就可以)

(4)发送http请求的工具

     <1>苹果原生:
     * NSURLConnection:用法简单,古老经典的一种方案.
      
     * NSURLSession:iOS7以后推出的技术,功能比NSURLConnection更加强大

     * CFNetWork:NSURL 的底层,纯C语言,一般不用.
       
     <2>第三方框架:
     * ASIHttpRequest:http终结者,功能很强大,可惜作者已停止更新,2012年停止更新。可惜。。。
           
     * AFNetWorking:简单易用,提供了基本够用的常用功能,维护和使用者多.
             
     * MKNetWorkKit:简单易用,产自印度,维护和使用者少.

4、关于http短连接和socket长连接补充
为什么Http是无状态的短连接,而TCP是有状态的长连接? Http就是在每次请求完成后就把TCP连接关了,所以是短连接。直接通过Socket编程使用TCP协议的时候,因为我们自己可以通过代码去控制什么时候打开连接什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着。


5、常用请求方式get、post、head

(1)GET
     <1>用于一般的网络请求,请求参数封装在url后面,例  http://127.0.0.1/login?username=zhangqi&password=12345
 
     <2>参数长度有限制(一般2~8K)、速度快、不安全、会做本地缓存(保存在SQLite的数据库中(路径:NSHomeDirectory()))。
     <3>NSURLRequest默认使用GET请求。

(2)POST
     <1>可以做一般网络请求,也可以请求大数据,或者做数据上传。
     <2>需要设置设置 NSURLRequest 的 HTTPMethod、HTTPBody属性
     <3>没有长度限制、安全低效、私密信息必须使用POST、不做本地缓存


(3)HEAD请求方法
     <1>只获取响应头信息,不获取具体的数据内容.响应头中有我吗需要的内容,比如文件类型字段。
     <2>一般 HEAD 请求都使用同步的方法发送.因为不获取实体内容,返回的数据只有响应头信息.
     <3>request.HTTPMethod = @"HEAD"


6、RESTful设计风格

主要用于后端开发,主要的表现形式为使用同一个 URL,不同的 HTTP 访问方法,表达不同的语义。


7、网络连接状态码

(1)1xx消息
代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。

(2)2xx成功
代表请求已成功被服务器接收、理解、并接受。例:200 OK:请求已成功,请求所希望的响应头或数据体将随此响应返回。202 Accepted服务器已接受请求,但尚未处理。

(3)3xx重定向
代表需要客户端采取进一步的操作才能完成请求。

(4)4xx客户端错误
代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。例:404 Not Found :请求失败,请求所希望得到的资源未被在服务器上发现。408 Request Timeout请求超时。400 Bad Request 由于包含语法错误,当前请求无法被服务器理解。

(5)5xx服务器错误
代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。