HTTP:HyperText Transfer Protocol,超文本传输协议
该协议是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个客户端和服务器端请求和应答的标准。客户端通过使用Web浏览器、网络爬虫或者其它的工具发起一个HTTP请求到服务器上的指定端口(默认端口为80),应答的服务器上存储着资源,如HTML文件和图像,给予客户端资源的应答。
-特点:
- 支持客户/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。常用的方法有GET、HEAD、POST。每种方法规定了客户和服务器联系的类型不同。HTTP服务器的程序规模小,因而通信速度很快
- 灵活:HTTP允许传输任意类型的数据对象,正则传输的类型由Content-Type加以标记
- 无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可节省传输时间
- 无状态:指协议对于事物处理没有记忆功能,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
-工作流程
(1)首先客户机与服务器需要建立连接,只要单击某个超链接,HTTP的工作开始
(2)建立连接后,客户机发送请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,MIME信息(包括请求修饰符、客户机信息和可能的内容)
(3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息(包括服务器信息、实体信息和可能的内容)
(4)客户端接收服务器所返回的信息通过浏览器显⽰示在用户的显示屏上,然后客户机与服务器断开连接。
HTTP协议通常承载在TCP协议上,有时也承载于TLS或SSL协议层上,这时就是常说的HTTPS;HTTP协议永远是客户端发起请求,服务器端回送响应;同一个客户端的本次请求和上次请求没有对应关系
-重要概念
- 连接:Connection,一个传输层的实际环流,它建立在两个相互通讯的应用程序之间。
- 消息:Message,HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
- 请求:Request,一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
- 响应:Response,一个从服务器返回的信息包括HTTP协议的版本号、请求的状态和文档的MIME类型
- 资源:Resource,由URI标识的网络数据对象或服务
- 实体:Entity,数据资源或来自服务资源的回应的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容
- 客户机:Client,一个为发生请求目的而建立连接的应用程序
- 用户代理:UserAgent,初始化一个请求的客户机。它们是浏览器、编辑器或其他用户工具
- 服务器:Server,一个接受连接并对请求返回信息的应用程序
- 源服务器:Originserver,一个给定资源可以在其上驻留或被创建的服务器
- 代理:Proxy,一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其他客户机建立请求。一个代理在发生请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求
- 网关:Gateway,一个作为其他服务器中间媒介的服务器,与代理不同的是,网关接受请求就好像对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源
- 通道:Tunnel,是作为两个连接中继的中介程序,一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
- 缓存:Cache,反应信息的局域存储
-HTTP请求详解
HTTP请求由三部分组成:请求行、请求头、请求正文
HTTP的8种请求方式:
- OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法
- GET 向特定的资源发出请求
- POST 向特定资源提交数据进行处理请求(例如提交表单或上传文件)数据被包含在请求体中
- HEAD 向服务器索要于GET请求相一致的响应,只不过响应体不会被返回
- PUT 向指定资源位置上传其最新内容
- DELETE 请求服务器删除Request-URL所标识的资源
- TRACE 回显服务器收到的请求,主要用于测试或诊断
- CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
-请求内容:
HTTP协议规定:一个完整的由客户端发给服务器的HTTP请求中包含以下内容:
- 请求行:包含了请求方法、请求资源路径、HTTP协议版本。
eg:GET /v2/movie/us_box HTTP/1.1 - 请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
eg: Host: api.douban.com:8080 //访问的服务器的主机地址等信息
User-Agent: Mozilla/5.0(Macintosh; Intel Mac OS X 10.9) Firefox/30.0
//客户端类型,客户端的软件环境
Accept: text/html, / //客户端所能接收的数据类型
Accept-Language: zh-cn //客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式 - 请求体:客户端发给服务器的具体数据,比如文件数据
-响应内容
- 状态行:包含了HTTP协议版本、状态码、状态英文名称
- 响应头:包含了对服务器的描述、对返回数据的描述
- Server: nginx // 服务器的类型 2.
- Content-Type: application/json; charset=utf-8 // 返回数据的类型
- Content-Length: 21670 // 返回数据的长度
- Date: Sat, 19 Sep 2015 05:02:56 GMT // 响应的时间
- 实体内容:服务器返回给客户端的具体数据,比如文件数据
每个请求或响应消息中都包含着头域,每个头域由一个域名,冒号和域值三部分组成。域名大小写无关,域值前可以添加任何数量的空格符,头域可被扩展为多行,在每行开始处,使用至少一个空格或制表符。
下面举例构建HTTP的GET请求:
1.从NSURL中解析出服务器的IP地址
//1.通过url获取host
NSString *host = url.host;
//2.通过host解析ip地址
struct hostent *host_ip = gethostbyname([host UTF8String]);
//获取ip地址
struct in_addr **addrList = (struct in_addr **)host_ip->h_addr_list;
for (int i = 0; addrList[i]!=NULL; i++) {
NSLog(@"ip is:%s",inet_ntoa(*addrList[i]));
}
NSString *ip = [NSString stringWithCString:inet_ntoa(*addrList[0]) encoding:NSUTF8StringEncoding];
//3.获取端口号
NSNumber *port = url.port;
2.构建HTTP的GET请求
例子:图片中内容即是GET请求行,我们要拼接出下面的内容
注意:
- 一定要换行,换行符为 \r\n
- 第一行分别表示请求方式,请求路径,HTTP协议版本
- 第二行表示后面的文档属于什么类型
- 第三行表示主机域名
- 第四行表示连接完毕后关闭连接。因为HTTP1.1版本默认对方支持长连接,如果不希望长连接则需要标明
- 第五行表示客户端浏览器内核版本,服务器可以根据这个参数返回不同数据格式
使用NSString拼接:
//拼接请求信息 \r\n == 换行
NSString *sendMsg = [NSString stringWithFormat:@"GET %@ HTTP/1.1\r\n",url.path];
sendMsg = [sendMsg stringByAppendingFormat:@"Host: %@\r\n",url.host];
sendMsg =[sendMsg stringByAppendingString:@"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"Content-Encoding: utf-8\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"Connection: close\r\n"];