原文链接 https://juejin.im/entry/5981c5df518825359a2b9476
HTTP网络请求的基本介绍
HTTPH (Hyper Text Transfer Protocol超文本传输协议)是一种应用层协议,它通过TCP实现了可靠的数据传输,能够保证该数据的完整性,正确性。而TCP对于数据传输控制的优点也能够体现在HTTP上,使得HTTP数据传输吞吐量,效率得到保证。
对于移动开发来说,网络应用基本上都是C/S架构。客户端通过向服务端发起特定的请求,服务器返回结果,客户端解析结果,然后将结果展示在UI上,他们的之间的交互图如下
详细的交互步骤:
- 客户端执行网络请求,从URL中解析出服务器的主机名
- 将服务器的主机名转换成服务器的IP地址
- 将端口从URL中解析出来
- 建立一条客户端与Web服务器的TCP连接
- 客户端通过输出流向服务器发送一条HTTP请求
- 服务器向客户端发送一条HTTP响应报文
- 客户端从输入流解析报文
- 客户端解析报文,关闭连接
- 客户端将结果显示在UI上
HTTP的请求方式
GET请求
GET是最常见的方法,它的作用是获取服务器中某个资源,下图显示了一个例子,在这个例子中,客户端用GET方法发起了一次HTTP请求,然后服务端将对应的资源返回给客户端
注意:GET请求的参数都需要放到请求的URL中。
POST请求
POST方法起初始用来向服务器传递数据的,实际上,POST请求通常会用来提交HTML的表单,表单中填好的数据会被传输给服务器,然后由服务器对这些数据进行处理,下图显示了一个用POST请求的执行流程。
比较:
GET
- GET请求能够被缓存
- GET请求有长度限制
- GET请求会保存在浏览器的浏览记录中
- GET请求的URL能够保存为浏览器书签
POST
- POST请求不能够被缓存
- POST请求没有长度限制
- POST请求不会保存在浏览器的浏览记录中
- POST请求的URL无法保存为浏览器书签
PUT请求
与GET从服务器中读取资源相反,PUT方法会向服务器写入资源,有些发布系统允许用户创建Web页面,并用PUT直接向其传输到Web服务器中。如下图所示
PUT方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,如果那个URL已经存在的话,就用这个资源来代替它。
DELETE请求
顾名思义,DELETE方法所做的事情就是请求服务器删除请求URL所指定的资源,但是客户端应用程序无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知的情况下撤销请求,下图显示了一个DELETE方法实例。
注:DELETE方式与GET请求一样,参数都是需要放在请求的URL中。
HEAD请求
HEAD方法与GET方法的行为很类似,但服务器在响应中只返回首部,不会放回实体的主体部分,这就允许客户端在未获取实际资源的请求下,对资源的首部进行检查,使得HEAD可以在不获取资源的情况下了解资源的情况(比如,判断其类型),通过看响应中的状态码,看看某个对象是否存在;通过查看首部,测试资源是否被修改了。
TRACE 请求
客户端发起一个请求,这个请求可能要穿过防火墙,代理,网关或者其他一些应用程序,每个中间节点都可能会修改原始的HTTP请求,TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。
TRACE请求会在目的服务器端发起一个“环回”诊断。形程最后一站的服务器会弹回来一条TRACE响应,并在响应主体携带它收到的原生报文,这样客户端就可以查看所有在HTTP应用层组成的请求、响应链、原生报文是否以及如何被毁坏或修改过。如下图所示
TRACE方法主要用户诊断,也就是说,用于验证请求是否如愿穿过请求、响应链。它是一种很好的工具,可以查看代理和其他应用程序对用户请求所产生的效果。
OPTIONS请求
OPTIONS方法请求Web服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法(有些服务器可能只支持一些特殊的对象使用特定的操作)。这对客户端应用程序提供了一种手段,使其不用实际访问那些资源就能判定访问各种资源的最优方式。下图显示了一个OPTIONS方法请求。
HTTP请求的几大要素
请求行
请求行包含请求方法(Methode)、请求统一资源标识符(RUL)、HTTP版本号。
URL就是URL中排除Host剩下的部分,也就是资源在服务器本地上的路径
请求头
请求头主要存放客户端想给服务端的附近信息。HTTP请求在iOS中用NSURLRequest
与NSMutableRequest
表示;HTTP响应用NSHTTPURLResponse
表示
Host:目标服务的网络地址
Accept:让服务器知道客户端能接受的数据类型,如 text/html/json
Content-Type:body中的数据类型,如 application/json; charest=UTF-8
Accept-Language:客户端的语言环境,如 zh-cn
Accept-Encoding:客户端支持的数据压缩格式:如gzip
User-Agent:客户端的软件环境
Connection:keep-alive,该字段是从HTTP1.1才开始有的,用来告诉服务端着是个持久链接,“请服务端不要在发出响应之后立即断开TCP连接”
Content-Length:body的长度,如果body为空则该字段值为0。该字段一般在POST请求中才会有
Cookie:记录者用户信息的保存在本地的用户数据,如果有会被自动附上。
Field:
请求体
真正需要给服务器端的数据,在使用POST-multipart上传请求中请求提就是上传文件的二进制NSData类型数据;在GET请求中请求体为空;在普通的POST请求中请求提就是一些表单数据。在iOS中一般用NSMutableRequest 的HTTPBody属性表示,添加body用 [NSMutalbeURLRequest
setHTTPBody]
响应状态行
响应状态行是服务器返回给客户端状态的信息,包含HTTP版本号、状态码、状态码对应的英文名称。
HTTP版本介绍
HTTP1.1之前
1、不支持持久连接。一旦服务器对客户端发出响应就立刻断开TCP连接。
2、无请求头跟响应头
3、客户端的前后请求是同步的,下一个请求必须等上一个请求从服务端拿到响应后才能发出,有点类似多线程的同步机制。
HTTP1.1(主流版本,1999发布)
1、增加请求头跟响应头
2、支持持久连接。客户端通过请求中指定Connection为keep-alive告知服务器不要在完成响应后立即释放连接。HTTP是基于TCP的,在HTTP1.1中一次TCP连接可以处理多次HTTP请求
3、客户端不同请求之间是异步的,下一个请求不必等到上一个请求回来后再发出,而可连续发出请求,有点类似多线程异步处理。
HTTP2.0(2015年)
1、HTTP2.0采用二进制格式而非文本格式
2、HTTP2.0是完全多路复用的,而非有序阻塞的。只需一个连接即可实现并行。
3、使用报头压缩,HTTP2.0降低了开销
4、HTTP2.0让服务器可以将响应主动推送到客户端缓存中。
HTTPS与HTTP的一些区别
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
HTTP协议运行在TCP之上,所有的传输的内容都是明文,在HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。