• 1

  • 350

HTTP 的概念、原理、工作机制、数据格式

3天前

HTTP定义

英文名字:Hypertext Transfer Protocol

中文名字:超文本传输协议

超文本

超文本,即「扩展性文本」,指的是HTML中可以有链向别的文本的链接

协议

协议,通信双方制定的一个标准,使得两个通信方可以顺畅的沟通。 最后再说一句,HTTP是一个属于应用层的面向对象的协议。

HTTP的工作方式

浏览器

用户输入地址后回⻋或点击链接 -> 浏览器拼装 HTTP 报文并发送请求给服务器 -> 服务器处理请求后发送响应报文给浏览器 -> 浏览器解析响应报文并使用渲染引擎显示到界面

这里的服务器,在回车后,DNS会解析域名,获得服务器的IP地址。

手机App

用户点击或者界面自动触发联网需求 -> Android代码调用拼装 HTTP 报文并发送给服务器 -> 服务器处理请求后发送响应报文给手机 -> Android代码处理相应报文并作出相应的处理(如存储数据,加工数据,显示数据到界面)

URL和HTTP报文

URL格式

三部分:协议类型、服务器地址(和端口号)、路径 协议类型://服务器地址[:端口号]路径

http://github.com/mariolu0605/ShapeLoading
协议:http
服务器地址:github.com
路径:mariolu0605/ShapeLoading
复制代码

HTTP报文

报文格式

请求报文

响应报文

Request Method

GET
  • 用于获取资源
  • 对服务器数据不进行修改
  • 不发送body
  • 幂等

POST
  • 用于增加或修改资源
  • 发送给服务器的内容写在body里
  • 非幂等

PUT
  • 用于修改资源
  • 发送给服务器的内容写在body里
  • 幂等

那么问题来了,POST和PUT有啥区别呢?

PUT是幂等的,POST是非幂等的。 举个🌰:比如在访问API时,需要我们往一个URL发送POST或者PUT方法。我们需要根据我们的需求来判定是否需要幂等。比如我们往http://github.mariolu/users 发送两次请求,如果在服务端产生了两个结果,那么说明不是幂等,如果第二次请求覆盖了第一次,那么说明是幂等。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。 我们要根据规则来编码,所以后面就引用了REST。

DELETE
  • 用于删除资源
  • 不发送body
  • 幂等

HEAD
  • 用法和GET的使用方法完全相同

区别:返回的响应中没有body 我们只需要获取非body的信息时,使用HEAD可以节约资源。 举个🌰:我们在访问服务器时,可以先用HEAD访问,查看本地缓存和服务器内容是否一致,如果一致直接加载本地内容。

Status Code 状态码

三位数字,用于对响应结果做出类型化描述

  • 1xx:临时性消息。如100(继续发送)101(正在切换协议)
  • 2xx:成功。如200(请求成功)、201()。
  • 3xx:重定向。如301(永久移动)、302(暂时移动)、304(内容未改变)。
  • 4xx:客户端错误。如400(客户端请求错误)、401(认证失败)、403(被禁止)、404(找不到资源)。
  • 5xx:服务器错误,如500(服务器内部错误)。

Header 首部

作用:HTTP消息的metadata。

metadata 原数据。主要描述数据的属性信息。

HOST

目标主机。注意:不是用于网络上寻址的,而是在目标服务器上定位子服务器的。

因为一个IP可以对应很多的子服务器(多个域名)。 举个🌰:192.168.31.111对应着 www.mariolu01.com , www.mariolu02.com 访问的IP地址相同,但是需要我们定位要访问的子服务器,这时候就需要HOST来定位。

Content-Type

指定body的类型。主要有四类

  • text/html

请求 Web ⻚面时返回响应的类型,Body 中返回 html 文本。格式如下:

  • x-www-form-urlencoded

Web页面纯表单提交,如页面的登录

<form method="POST" enctype="application/x-www->form-urlencoded">

...

</form>
复制代码

格式如下:

  • multipart/form-data

含有二进制文件时的提交方式,比如头像上传,上传文件等。

<form method="POST" enctype="multipart/form-data">

...

</form>
复制代码

格式如下:

Content-Type里的boundary是分隔符。 为什么需要分隔符呢?

因为发送请求时,仅仅知道总长度,比如上面的请求,同时传入一个文本,和一张图片,如果没有分割符的话,没有办法对二者进行区分。

  • application/json , image/jpeg , application/zip ...

请求中提交json

响应中返回json

请求中提交二进制内容

Content-Length

指定 Body 的⻓度(字节)。 那为啥需要Content-Length呢?为什么不直接用一个标识符表示结束呢? 因为Body中可能包含一些二进制数据,所以用一些标识符(如\n,*等)来表示结束,可能和一些二进制的数据的表现形式相同,从而导致还没结束,但是读取Body就结束了。

Transfer:chunked(分块传输编码)

当响应发起时,但是内容的长度还没确定下来。用途是尽早给出相应,来减少用户等待 图片.jpg

以0作为结束的标志

Location

指定重定向的目标URL

User-Agent

用户代理,即是谁实际发送请求、接受响应的,例如手机浏览器、某款手机 App。 这个Header可以用于判断实际发送方是谁,来确定页面大小,比如同一个网站,电脑端和手机端显示的网页是有区别的。

Range/Accept-Range

按范围取数据 当响应报文中出现Accept-Range: bytes表示服务器支持按字节来取范围数据 Range: bytes=<start>-<end> 请求报文中出现,表示要取哪段数据 Content-Range:<start>-<end>/total 响应报文中出现,表示发送的是哪段 数据 作用:断点续传、多线程下载。

其他 Headers

  • Accept: 客户端能接受的数据类型。如 text/html
  • Accept-Charset: 客户端接受的字符集。如 utf-8
  • Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
  • Content-Encoding:压缩类型。如 gzip
免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

物联网

350

相关文章推荐

未登录头像

暂无评论