HTTP的简单介绍

原文链接 https://juejin.im/entry/5981c5df518825359a2b9476

HTTP网络请求的基本介绍

HTTPH (Hyper Text Transfer Protocol超文本传输协议)是一种应用层协议,它通过TCP实现了可靠的数据传输,能够保证该数据的完整性,正确性。而TCP对于数据传输控制的优点也能够体现在HTTP上,使得HTTP数据传输吞吐量,效率得到保证。
对于移动开发来说,网络应用基本上都是C/S架构。客户端通过向服务端发起特定的请求,服务器返回结果,客户端解析结果,然后将结果展示在UI上,他们的之间的交互图如下

详细的交互步骤:

  1. 客户端执行网络请求,从URL中解析出服务器的主机名
  2. 将服务器的主机名转换成服务器的IP地址
  3. 将端口从URL中解析出来
  4. 建立一条客户端与Web服务器的TCP连接
  5. 客户端通过输出流向服务器发送一条HTTP请求
  6. 服务器向客户端发送一条HTTP响应报文
  7. 客户端从输入流解析报文
  8. 客户端解析报文,关闭连接
  9. 客户端将结果显示在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中用NSURLRequestNSMutableRequest表示;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可以有效的防止运营商劫持,解决了防劫持的一个大问题。

0%