Objective-C的网络请求相关——Http超文本传输协议学
�Http协议 - 超文本传输协议
Http协议是应用层协议,底层要求的传输协议必须是可靠的传输协议,通常是TCP协议。
Http协议规定客户端与服务端之间的通讯方式为一次请求一次响应,即客户端发起链接,并向服务端发送一个标准的Http请求,而后服务端处理该请求后给予一个标准的Http响应,所以对于Http协议而言,服务端永远不会主动响应客户端。
Http协议现在常用的是Http1.1版本协议,在Http1.0版本时,要求一次会话只能完成一次请求与响应。即客户端与服务端建立TCP链接后,发送一次请求,当服务端给予响应后立即断开链接。在Http1.1版本中,一个较大的改动就是在一次会话中可以完成多次请求与响应。
Http协议中规定的请求与响应的内容大部分是文本数据,但是这些字符只能是ISO88590-1编码中出现的字符,这意味着在Http协议中是不能直接出现中文等字符的。
Http中的请求定义Request,一个请求通常包含三部分:请求行,消息头,消息正文。
请求行的格式为: Method(请求方式) URL(请求的资源路径) Protocol(协议版本)
消息头是客户端发起请求时传递过来的一些附加信息,比如描述客户端是谁,以及希望与客户端如何通讯,描述消息正文的长度以及内容类型等信息。消息头由若干行组成,每一行为一个消息头,格式为Name :Value(CRLF)格式,当所有消息头全部发送完毕后会单独发送一个CRLF(回车符(CR)和换行符(LF))。一些消息头的名称的含义:
- Content - Type :用于说明消息正文的内容是什么类型的数据。
- Content - Length : 用于说明消息正文的数据长度(字节量)。
- If-Modified-Since :与响应头的Last-Modified配合使用,当客户端第二次请求已响应过的URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问该时间之后文件是否有被修改过。如果服务器端的资源没有变化,则自动返回 HTTP 304(Not Changed)状态码,内容为空;当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。
消息正文是二进制数据,内容是用户实际向服务端传递的数据。它可能是用户传递的注册用户的信息,上传的附件内容等。一个请求中可以不含有消息正文部分。请求中是否含有消息正文的一个重要标志是请求的消息头中是否含有以下两个头:
- Content - Type :用于说明消息正文的内容是什么类型的数据。
- Content - Length : 用于说明消息正文的数据长度(字节量)。
Http响应是服务器端发送给客户端的内容。一个响应应当包含三部分:状态行,响应头,响应正文。
状态行格式分为三部分:Protocol(协议版本) Status_code(状态代码) Status_reason(状态描述) (CRLF)
状态代码是一个3位数字,分为5类:
- 1XX :消息,在Http1.0协议时为保留部分,未使用。
- 2XX :成功,表示客户端请求成功
- 3XX:重定向,表示客户端需要进一步操作后才能完成请求
- 4XX:客户端错误,表示客户端的请求无效
- 5XX:服务端错误,表示请求被接受,但是服务器处理时发生了错误。
常见状态代码:
- 200 : 请求已接受,并正常响应客户端。
- 302 : 要求客户端进一步请求服务端指定的路径
- 404 : 客户端请求的资源未找到
- 500 : 服务端发生错误
响应头的格式与意义同请求中的信息头一样。一些响应头的名称的含义:
- Content - Type : 说明响应正文的数据类型。
- Content- Length :说明响应正文的长度(字节量)。
- Last-Modified :标记此文件在服务器端最后被修改的时间。格式类似:Fri , 12 May 2006 18:53:33 GMT。
- Etag :HTTP协议ETag为“被请求变量的实体值”(另一种说法是资源的特定版本的标识符)。
响应正文也是二进制数据,是服务端响应给客户端的实体数据,通常就是客户端所请求的资源。一个响应中是否含有响应正文可以通过响应头中的两个信息得知:
- Content - Type : 说明响应正文的数据类型。
- Content- Length :说明响应正文的长度(字节量)。
客户端就是通过这两个头来读取并理解响应正文内容的。
HTTP Streaming - 推送形式的数据传输技术
HTTP Streaming是一种推送形式的数据传输技术,它通过无限期开放的HTTP连接让web服务器(tomcat)能持续向客户端(浏览器)传送数据。在HTTP Streaming下,web服务器会握住客户端的请求并让返回保持开放,这样服务器可以通过返回一直发送数据。这个请求-返回的通道会一直开启,除非我们显示的要求关闭。