Http权威指南笔记(十二)——实体与编码

2023-05-16

本章会对HTTP实体和编码进行学习。这里的实体是指HTTP中真正需要传输的实体内容(比如一张图片,一份文档)。这里的编码主要是指内容编码和传输编码。

1 报文与实体

如果将HTTP对内容的传输比喻成实际生活中一些货物的运输的化。那HTTP报文就相当于是用于运输货物的“箱子”,而实体内容则是我们真正需要运输的“货物”。所以实体也就是被封装在了报文当中。

现实货物运输中,一般箱子上也会有一些描述信息,用于对运输的货物进行描述说明。HTTP报文中也是一样,也会有相应的实体首部,对实体内容进行描述说明,以便我们的接收方能正确处理实体内容。在HTTP/1.1中常用的实体首部如下所示:

  • Content-Type:实体内容的MIME类型
  • Content-Length:实体内容的长度或大小
  • Content-Language:传输的实体内容最匹配的语言类型
  • Content-Encoding:对实体数据所做的变换(如:压缩)
  • Content-Location:实体数据的一个备用位置
  • Content-Range:将实体分为几个部分进行传输的时候,说明该部分实体是属于哪个部分
  • Content-MD5:内容数据的校验和
  • Last-Modified:所传输内容最近一次创建或者修改时间
  • Expires:数据的失效时间
  • Allow:该资源所允许的请求方法(如:GET, HEAD等)
  • ETag:该份实体数据的唯一验证码
  • Cache-Control:实体内容缓存有关的控制

上述的首部内容,大部分在之前的文章中已经介绍过了,这里就不再详细介绍了。这里我们会对部分之前没有详细介绍的首部进行一个介绍,说明其中的一些注意事项。

2 实体大小(长度)控制

Content-Length是用于支持实体内容的大小或者长度的首部。此处的大小是指内容编码之后的大小。比如我们传输一份文档,在传输之前我们进行了gzip压缩,最终传输的是这份压缩后的文档,此时,这里的Content-Length的大小是指gzip压缩后的大小,而不是原始文档大小。

2.1 一些注意事项

  1. 正确携带Content-Length首部
    同时为了接收端能正确处理实体内容,除非是使用分块编码,其他情况都应该带上Content-Length的值。有了这个值,通过对收到的内容实际长度和该首部的值进行对比,接收端就能正确判断报文是正常结束,还是因为连接断开等其他非正常结束。
  2. 要避免给出错误的Content-Length的值
    Content-Length的值错误比缺少Content-Length首部带来的影响还要打。缺少该首部是在某些情况会影响到对内容的处理,但是如果值错误,这个时候接收端始终会认为收到的内容有误,无法正确处理内容。
  3. 持久连接必须携带Content-Length
    持久连接是必须有Content-Length首部。因为持久连接一直处于连接状态,接收端是无法从关闭连接等其他方式得知报文结束的,就必须通过Content-Length的值来判断报文再哪里结束,下一条报文从哪里开始。

2.2 确定实体(大小)长度的规则

既然Content-Length首部对于正确处理实体内容如此重要,正常情况也需要给出该首部正确的值,但是并不是所有的服务器或者客户端都严格遵循这一规定。实际处理当中,为了正确确定实体内容的长度,我们一般遵循如下几条规则:

  1. 如果是某些特定不允许携带有实体内容的报文类型,直接忽略Content-Length首部(比如HEAD响应和GET一样,也应该有Content-Length首部,但是其是不会携带实体内容的,这个时候我们直接忽略该首部即可)
  2. 如果报文中含有Transfer-Encoding首部(不采用HTTP默认的恒等编码),这个时候判断报文结束是根据一个称为“零字节块”(zero-byte chunk)的特殊模式,或者是因为连接断开关闭。也就意味着这个时候如果即使有Content-Length首部,也应该被忽略。
  3. 如果报文类型允许携带实体内容,同时也没有非恒等的Transfer-Encoding首部,这个时候,就应该以Content-Length首部的值就是报文实体的长度。
  4. 如果报文使用了multipart/byteranges(多部分 / 字节范围)媒体类型,允许报文可以不携带Content-Length首部,这个时候每个分块就必须说明自己的大小,接收端可以通过这个数据判断出整个实体内容的大小。但是使用该种方式有个前提,是发送端要知道接收端是能识别和处理这种类型的报文,否则就不能使用这种类型。
  5. 如果对于以上几种规则都不匹配,这个时候默认就以连接关闭为报文结束。但是这种方式一般只有服务器对客户端使用。因为客户端如果对服务器使用这种方式,服务端的响应就没法送回客户端了。如果客户端非要使用这种方式,可以通过半关闭的方式(即先关闭发送端,接收端保持连接),具体信息可以查阅Http权威指南笔记(四)——连接管理。

3 实体摘要

现在我们的请求很多时候都会经过一些代理。如果我们中间的代理处于有误,或者转码出现不兼容等问题的时候,就可能会造成我们收到的报文实体是不正确的。这个时候为了接收端能够自己进行验证收到实体是否正确,发送端可以生成一个实体数据的校验和给接收端用于检测报文的完整性。该校验和正常的中间代理是不会对此进行修改的。不过这种方式只能防止非恶意的修改,如果是恶意修改,除了修改报文实体也会同时修改校验和,这个时候接收端是无法判断的。

一般校验和会放入Content-MD5首部进行传输。应该注意的是该校验对是在内容编码之后(如果存在内容编码),传输编码之前(如果存在传输编码)的数据进行计算生成的。所以接收端在收到报文后,需要先进行传输编码的解码,然后对解码后的内容进行验证。

4 媒体类型和字符集

Content-Type首部用于说明实体主体的MIME类型。关于MIME类型,使用的是在IANA中注册标准MIME类型,一般格式为“主类型/子类型”,如:text/html, img/jpeg等。这里就不详细说明了,感兴趣的可以自己搜索下相关资料。这里需要注意一点是,该首部说明的是内容编码之前的,也就是原始实体内容的类型。

该首部除了说明实体的MIME类型外,还可以说明实体所使用的字符编码信息,如:
Content-Type: text/html; charset=utf-8
字符的信息,一般是跟在MIME类型后面,用charset进行指定。字符编码的详细信息我们将在下一篇文章进行介绍。

指定的MIMI类型中,有个稍微特殊的类型就是多部分媒体类型。一般我们在提交表格或者将文档内容作为多个片段进行传世的时候会用到。

HTTP 使用 Content-Type:multipart/form-data 或 Content-Type:multipart/mixed 这样的首部以及多部分主体来发送这种请求,举例如下:
Content-Type: multipart/form-data; boundary=[abcdefghijklmnopqrstuvwxyz]
其中boundary用于说明用于分隔各个部分的字符串,如下面的传输内容是一段提交表单内容的示例:

Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Sally
--AaB03x
Content-Disposition: form-data; name="files"; filename="essayfile.txt"
Content-Type: text/plain
...contents of essayfile.txt...
--AaB03x--

同时这种方式还可以进行嵌套的,比如我们在上述传输表单普通文本内容的基础上,增加一个附件的功能(传输一个text文件和一张gif图片),报文示例如下:

Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Sally
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y
--BbC04y
Content-Disposition: file; filename="essayfile.txt"
Content-Type: text/plain
...contents of essayfile.txt...
--BbC04y”
Content-Disposition: file; filename="imagefile.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary
...contents of imagefile.gif...
--BbC04y--
--AaB03x--

可以看到,整个表单的内容使用多部分媒体传输的时候使用--AaB03x--进行分割,在涉及到附件的时候,我们再次使用多部分媒体类型进行传输,这个时候使用--BbC04y--进行内容分割。

除了请求,我们的响应也是可以使用多部分媒体类型的,如果下面的示例,展示了一个对文档不同范围请求产生的响应:

HTTP/1.0 206 Partial content
Server: Microsoft-IIS/5.0
Date: Sun, 10 Dec 2000 19:11:20 GMT
Content-Location: http://www.joes-hardware.com/gettysburg.txt
Content-Type: multipart/x-byteranges; boundary=--[abcdefghijklmnopqrstu
vwxyz]--
Last-Modified: Sat, 09 Dec 2000 00:38:47 GMT

--[abcdefghijklmnopqrstuvwxyz]--
Content-Type: text/plain
Content-Range: bytes 0-174/1441
Fourscore and seven years ago our fathers brought forth on this
continent a new nation, conceived in liberty and dedicated to the
proposition that all men are created equal.
--[abcdefghijklmnopqrstuvwxyz]--
Content-Type: text/plain
Content-Range: bytes 552-761/1441

But in a larger sense, we can not dedicate, we can not consecrate,
we can not hallow this ground. The brave men, living and dead who
struggled here have consecrated it far above our poor power to add
or detract.
--[abcdefghijklmnopqrstuvwxyz]--
Content-Type: text/plain
Content-Range: bytes 1344-1441/1441
and that government of the people, by the people, for the people shall
not perish from the earth.

--[abcdefghijklmnopqrstuvwxyz]--

5 内容编码

很多时候我们在传输内容实体之前,会对实体内容进行编码处理。比如进行gzip压缩,或者是加密等。一般我们称之这个过程为内容编码。

5.1 内容编码的过程

内容编码的主要过程有如下3步:

  1. 生成原始报文,一般原始报文中含有Content-Type和Content-Length首部。
  2. 编码服务器(可能是原始发送端本身,也有可能是发送端的下行代理)对报文实体进行编码。编码后一般也会携带Content-Type和Content-Length。Content-Type和原始报文一致,但是Content-Length可能会有变化。比如我们进行gzip压缩后,这里的Content-Length就是压缩后的大小。
  3. 接收端收到报文后,先对报文进行解码,获得原始报文后再做处理

5.2 内容编码的类型

HTTP定义了一些标准的内容编码类型,当然也允许我们自行扩展一些编码类型。常用的编码类型如下表所示:

Content-Encoding 值描  述
gzip表明实体采用 GNU zip 编码a
compress表明实体采用 Unix 的文件压缩程序
deflate表明实体是用 zlib 的格式压缩的b
identity表明没有对实体进行编码。当没有 Content-Encoding 首部时,就默认为这种情况

这里面gzip是使用比较平凡的一种压缩编码方式。

内容编码一般都是服务器进行编码,客户端收到报文后进行解码。这样,可能存在一种情况是服务器用了一种客户端无法解码的类型进行编码,这个时候就会出现错误。在HTTP中为了解决这种错误,引入了Accept-Encoding首部。客户端在请求的时候,可以使用该首部告知服务器端客户端可以处理的编码类型。同样,如果可以接收处理多个编码类型,我们可以使用“,”隔开每种编码,同时可以为每种编码指定一个优先级,告知服务器,优先选择哪种编码,示例如下:

Accept-Encoding: compress, gzip
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0”

其中"*"代表可以接收任务编码类型,如果客户端请求的时候没有使用Accept-Encoding首部,也即默认可以处理所有编码类型。

6. 传输编码和分块编码

6.1 传输编码

虽然这里的传输编码和前面介绍的内容编码都是用于对实体操作。但是两种编码的目的不太一样,内容编码一般是为了对内容进行压缩和转换等,而传输编码是为了其他一些架构的因素考虑进行使用。同样两种编码对某些首部的影响也不一样,比如实体摘要Content-MD5,一般是用作于内容编码之后,传输编码之前。同样,如果一般代用传输编码后,Content-Length首部的值也通常会做忽略处理。

实际使用当中,一般传输编码主要用于解决报文未知大小和安全性的问题。不过由于安全性现在通常用HTTPS就能很好处理了。所以大多数时候传输编码就是用于解决报文未知大小的问题。比如一些动态生成的报文,如果不能生成完成我们就没法得知报文实体的大小,但是有时候我们又希望在完全生成完成之前就开始传输数据,提高效率。

HTTP协议中提供了Transfer-Encoding和TE两个首部用于控制传输编码。其中Transfer-Encoding用于发送方告知接收方用了何种传输编码。而TE和Accept-Encoding类似,是接收端告诉发送端可以处理哪些传输编码。

6.2 分块编码

目前HTTP规范中,仅仅定义了一种传输编码——分块编码。分块编码把报文分割为若干个大小已知的块。块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了,也就解决了我们上面提到的未知报文大小的问题。

在正常情况,如果不是使用的持久连接。那么客户端直接可以一直读取到连接关闭就意味着报文结束了。但是如果是在持久连接中,如果事先不知道报文实体的大小。这个时候就可以使用分块编码。分块编码允许服务器把主体逐块发送,说明每块的大小就可以了。因为主体是动态创建的,服务器可以缓冲它的一部分,发送其大小和相应的块,然后在主体发送完之前重复这个过程。服务器可以用大小为 0 的块作为主体结束的信号,这样就可以继续保持连接,为下一个响应做准备。

如果客户端的 TE 首部中说明它可以接受拖挂的话,服务器就可以在分块的报文最后加上拖挂。不过该选项为可选选项,所以就看你是否需要了。比如我们可以在最后拖挂一个报文整个实体内容的校验和。客户端在接收完全部分块内容后,也可以计算出报文实体的校验和,然后进行对比,以验证报文内容的完整性。

我们在使用传输编码的时候,一定要注意遵守如下规则:

  • 传输编码中必须包含“分块”,除非使用连接关闭来结束报文
  • 当使用分块编码的时候,必须是最后一个作用域主题的编码
  • 分块编码不能多次使用在同一主体上

7 范围请求

有些时候,我们并不需要请求一个完整的文档内容,可能只需要文档中的某个片段。比如在多线程下载的时候,可能每个线程都只需请求资源的部分内容即可。这个时候就可以利用范围请求来实现。HTTP中,通过Range首部实现范围请求。如下:

GET /bigfile.html HTTP/1.1
Host: www.joes-hardware.com
Range: bytes=4000-
……

该示例中,客户端通过Range首部,告诉服务器我只要资源第4000字节以后的内容。这里我们不知道文档总的打下,所以可以通过不指定结尾字节数,告知服务器返回从4000到结尾的部分。如果你知道具体需要的范围,也可以指定具体的区间。

8 差异编码

服务器上的文档并不是一层不变的,如果我们服务器上的文档发生了变化。客户端缓存了变化之前的文档内容,这个时候客户端发起请求的时候。如果把整个文档全部返回给客户端,那是很浪费资源的,特别是有时候改动很小的时候。这个时候如果我们可以只返回有改动(差异)的部分,客户端拿到这部分内容之后,将本地缓存更新后展示给用户即可。这样既节约资源,也能提高传输的速度。这种情况就可以利用差异编码实现。差异编码的过程如下图所示:
差异编码
上图展示了差异编码的结构,包括请求、生成、接收和装配文档的全过程。客户端必须告诉服务器它有页面的哪个版本,它愿意接受页面最新版的差异(delta),它懂得哪些将差异应用于现有版本的算法。服务器必须检查它是否有这个页面的客户端现有版本,计算客户端现有版本与最新版之间的差异(有若干算法可以计算两个对象之间的差异)。然后服务器必须计算差异,发送给客户端,告知客户端所发送的是差异,并说明最新版页面的新标识(ETag),因为客户端将差异应用于其老版本之后就会得到这个版本。
A-IM 是 Accept-Instance-Manipulation(接受实例操控)的缩写,用于告诉服务器可以接受差异的类型(算法)。服务器在响应中用IM首部告诉客户端,本次返回的差异数据是用的何种操作类型(算法)。
另外这里总结一下,目前在IANA中注册实例操作类型(不仅仅是差异操作类型,还包括前面的一些内容编码的操作)如下表所示:

类 型说  明
vcdiff用 vcdiff 算法计算差异a
diffe用 Unix 系统的diff-e 命令计算差异
gdiff用 gdiff 算法计算差异b
gzip用 gzip 算法压缩
deflate用 deflate 算法压缩
range用在服务器的响应中,说明响应是针对范围选择得到的部分内容
identity用在客户端请求中的 A-IM 首部中,说明客户端愿意接受恒等实例操控

上面的每个操作类型具体介绍,这里就不详述了,有兴趣的朋友可以自己搜索下相关的资料。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Http权威指南笔记(十二)——实体与编码 的相关文章

  • 主板串口FIFO大小设置

    FIFO大小和芯片 驱动有关系 xff0c 可以在设备管理器里面调整大小 1 进入设备管理器 xff0c 右键选择串口属性 2 在端口设置里面选择高级 3 可以单独设定每一个串口的接收和发送区大小
  • mac终端 python scrapy爬虫 zsh: no matches found

    在学习Python爬虫时 xff0c 进行到scrapy板块 xff0c 执行genspider命令 输入scrapy genspider tongcheng https bj 58 com sou key 61 E5 89 8D E7 A
  • JSESSIONID的简单说明

    1 第一次访问服务器的时候 xff0c 会在响应头里面看到Set Cookie信息 只有在首次访问服务器的时候才会在响应头中出现该信息 上面的图JSESSIONID 61 ghco9xdnaco31gmafukxchph Path 61 a
  • 史上最全的常用开发工具类收集(持续更新中)

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img BtY85pbk 1577412535564 https img shields io badge QQ群 523167548 20 ff69b4 svg API
  • MFC学习之vc通过HTTP请求:Get或Post方式获取JSON信息(亲测可用)

    前段时间公司项目需要跟上一级平台对接一些采集回来的数据 xff0c 通过HTTP xff0c post方法上传JSON信息到指定的接口地址 本来呢 xff1f 我在入职时是面试的售后岗 xff0c 一家小公司 xff0c 当时公司软件方面一
  • mac安装虚拟机VMware fusion12 和ubantu系统

    一 基本安装 下载虚拟机VMware fusion12 我选择了不更新新版本并且允许访问辅助功能 选择 新建 接下来选择 从光盘或者映像安装 从下载目录把ubantu系统拖拽过去 点击安装完成 xff0c 将ubantu系统保存在虚拟机上即
  • VSCode常用命令---记录自己的常用命令

    一 nvm相关命令 node版本管理 查看已安装的版本 nvm list 使用版本 nvm use 版本号 安装版本 nvm install 版本号 卸载版本 nvm uninstall 版本号 常用命令 全局包安装 多用于gitee下载后
  • Ubuntu18.04 Realsense D435i驱动安装与配置

    InterRealSenseD435i SDK安装 一 命令行的安装方式安装 1 注册服务器的公钥 xff1a 打开终端输入 sudo apt key adv keyserver keys gnupg net recv key C8B3A5
  • Qt上位机:与STM32串口通信,数据收发,按钮控制LED

    Qt学习了几周 xff0c 做一个串口助手巩固一下最近学习的内容 遇到的问题1 xff1a write函数只能发送一次数据 xff0c 想要继续发送必须重新关闭打开串口 xff0c 每次只能发送一次数据 解决办法 xff1a 在网上找不到类
  • 考研数据结构2 | 使用 C++ 实现顺序栈 | 栈的基本应用之计算后缀表达式

    文章目录 1 顺序栈 简介2 顺序栈 代码实现3 栈的应用之计算后缀表达式3 1 表达式介绍3 2 计算后缀表达式的实现3 3 完整代码3 4 LeetCode 提交代码 1 顺序栈 简介 在上一次的学习中 xff0c 使用指针实现了链栈
  • C++使用libcurl做HttpClient

    C 43 43 使用libcurl做HttpClient 分类 xff1a 基础技术分享 2012 06 14 19 25 1469人阅读 评论 3 收藏 举报 当使用C 43 43 做HTTP客户端时 xff0c 目前通用的做法就是使用l
  • CAN的报文格式

    CAN的报文格式 在总线中传送的报文 xff0c 每帧由7部分组成 CAN协议支持两种报文格式 xff0c 其唯一的不同是标识符 xff08 ID xff09 长度不同 xff0c 标准格式为11位 xff0c 扩展格式为29位 在标准格式
  • uabntu系统安装软件:E: 无法定位软件包问题

    血泪教训 耽误了贼长时间 一开始参考了如下链接 xff0c 然而我的问题一个没解决 xff0c 哭了 Ubuntu sudo apt get install 出现 E 无法定位软件包问题 解决方法汇总 遥想在想peach的博客 CSDN博客
  • 右手定则

    http www 7wenta com zhuanti 9648 html 问他 首页问答中心竞技场 学习快报 达人榜商城 问他手机版 注册 登录 问他网 gt 学习专题 gt 高中物理 gt 右手定则 物理题库练习题我要提问
  • 【机器人规划】Bug解析

    文章目录 参考文献简介Bug1算法Bug2算法Tangent Bug算法关于O i的选择激光雷达半径对算法的影响 总结 参考文献 自动驾驶决策规划算法 Bug Algorithms Bug算法 Robotic Motion Planning
  • ubantu虚拟机无法联网

    在VMware中安装Ubuntu虚拟机 xff0c 总会发生无法上网的情况 xff0c 主要情况有以下几点 xff1a 宿主机可以上网 xff1b 虚拟机却无法访问网页虚拟机ping不通任何网站 xff0c 用浏览器显示error 一般情况
  • 半监督语义分割论文学习记录

    Semi Supervised Semantic Segmentation with Cross Consistency Training 1 1 motivation 一致性训练的目的是在应用于输入的小扰动上增强模型预测的不变性 因此 x
  • 使用Qt二次开发周立功CAN(一)

    使用Qt二次开发周立功CAN xff08 一 xff09 使用Qt二次开发周立功的CAN通信 xff0c 第一步需要完成动态链接库的加载 xff0c 成功加载之后才能调用其提供的接口函数 加载库需要注意的问题有两个 xff1a 一是Qt版本
  • 字节序基础知识

    在各种计算机体系结构中 xff0c 对于字节 字等的存储机制有所不同 xff0c 因而引发了计算机通信领 域中一个很重要的问题 xff0c 即通信双方交流的信息单元 xff08 比特 字节 字 双字等等 xff09 应该以什么样的顺序进行传
  • vlc命令行: 转码 流化 推流

    写在命令行之前的话 xff1a VLC不仅仅可以通过界面进行播放 xff0c 转码 xff0c 流化 xff0c 也可以通过命令行进行播放 xff0c 转码和流化 还可以利用里面的SDK进行二次开发 vlc命令行使用方法 xff1a 1 x

随机推荐

  • C++ 简单实现HTTP GET/POST 请求

    HTTP 超文本传输协议 是一种客户端与服务端的传输协议 xff0c 最早用于浏览器和服务器之间的通信 xff0c 后来因为其使用灵活 方便等特点 xff0c 广泛用于客户端与服务端的通信 文章将简单介绍HTTP协议 xff0c 同时以C
  • STM32单片机HAL库下串口接收不定长数据

    xff33 xff34 xff2d xff13 xff12 单片机 xff28 xff21 xff2c 库下串口接收不定长数据 xff28 xff21 xff2c 库下的串口接收不定长数据代码配置代码实现代码演示总结 xff28 xff21
  • C++将一个数据格式化为固定长度的字符串

    经常会遇到将数据解析为文本文件的现象 xff0c 通常因为数据长度的不同导致 xff0c 可视化效果不好 写一个输入数据获取固定长度字符串的函数 xff0c 来得到一个固定长度的数据 xff0c 让格式化看起来好看一些 include lt
  • Socket原理与编程基础

    一 Socket简介 Socket是进程通讯的一种方式 xff0c 即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换 几个定义 xff1a xff08 1 xff09 IP地址 xff1a 即依照TCP IP协议分
  • mac 安装brew

    起因是这样的 xff0c 我想在mac上安装htop 然后我了解到可以用brew安装htop 然后再执行命令 brew install htop 所以我就开始吭哧吭哧安装brew 过程xue wei 曲折了一些 先是看到一个文章 xff0c
  • 【项目学习】C++实现高并发服务器——代码学习(三)用户注册登录功能

    项目来源 xff1a WebServer 上一篇 xff1a 存储解析HTTP请求报文 xff0c 创建响应报文 本文介绍以下功能的代码实现 利用RAII机制实现了数据库连接池 xff0c 减少数据库连接建立与关闭的开销 xff0c 同时实
  • 用CSS3实现动画进度条

    CSS3的新特性为我们实现漂亮的进度条扫清了障碍 xff0c 我们可以完全不需要任何图片和简单的Javascript代码就可以构建 一 第一个例子 效果图 xff1a Demo地址 xff1a http namepk sinaapp com
  • tcpdump命令使用详解

    tcpdump命令使用详解 疯狂的小企鹅的博客 CSDN博客 tcpdump命令详解全网最详细的 tcpdump 使用指南 王一白 博客园Tcpdump抓包工具实战教程 xff0c 让你知道一个抓包走天下 xff01 哔哩哔哩 bilibi
  • Chrome浏览器Postman插件安装包及安装教程

    最近电脑装了新环境 xff0c 以前本地的postman安装包竟然找不到了 xff0c 网上费尽心力找了很多资源 xff0c 终于找到纯净的安装包 xff0c 绕开套路 xff0c 现将Postman安装包及安装教程分享给各位 xff0c
  • LayoutInflater的错误用法(Avoid passing null as the view root )

    今天在练习使用Fragment的时候 xff0c 注意到在使用LayoutInflater的时候有黄色报警 xff08 Avoid passing null as the view root needed to resolve layout
  • Android M(6.0)运行时权限申请及遇到的坑

    一 概述 在对动态权限申请进行详细说明时 xff0c 还是先大致介绍下6 0后 xff0c google对权限的一个归类和划分 在Android M之前 xff0c 再开发应用的时候 xff0c 程序员只需要在AndroidManifest
  • Android DataBinding介绍(一)——简介、数据及方法事件绑定

    简介 Data binding 是Google在2015年7月发布的Android Studio v1 3 0 版本上引入的 xff0c 在2016年4月Android Studio v2 0 0 上正式支持 引入之初 xff0c 不支持双
  • CoordinatorLayout的使用(一)——简单使用

    简介 CoordinatorLayout是Android support design推出的新布局 xff0c 主要用于作为视图根布局以及协调子控件的行为 xff08 根据用户的触摸行为产生一定的动画效果 xff09 主要是通过设置子Vie
  • BottomSheetDialog的使用及注意事项

    一 BottomSheetDialog简介 用途 xff1a 底部弹起的view或dialog 实现 xff1a 其关键也是CoordinatorLayout与Behavior 要求 xff1a 采用View的形式展示的话 xff0c 用于
  • mac设置mysql的环境变量

    1 终端输入 xff1a PATH 61 34 PATH 34 usr local mysql bin 这种每次重新进入终端都得写一次 xff0c 比较麻烦 xff1b 2 改变 zshrc文件 终端输入 xff1a vim zshrc 按
  • 关于解决自定义FloatingActionButton滑动行为(Behavior)只隐藏不出现的问题

    最近在使用FloatingActionButton的时候 xff0c 自定义了其Behavior xff0c 然后发现在SDK在25及以上的时候 xff0c 出现了只能隐藏不能重新出现的问题 xff08 24及以下没有出现此问题 xff09
  • NestedScrolling机制解析(二)——NestedScrollView源码

    上一篇文章我们介绍了NestedScrollingParent和NestedScrollingChild接口 xff0c 了解了两个接口里的方法和相互之间的调用关系 这篇我们以NestedScrollView类为例 xff0c 看先嵌套滚动
  • CoordinatorLayout的使用(四)——通过AppBarLayout源码分析联动机制

    一 整体交互逻辑 上一篇文章 xff0c 我们从CoordinatorLayout源码出发 xff0c 分析了一下Behavior几个重点方法的调用逻辑和流程 知道了整个交互的分发流程 但是具体是怎么让一个不是ScrollingView类型
  • Http权威指南笔记(十)——认证

    现在大多数网站都会在cookie等客户端识别机制的基础上建立自己的认证机制 但是HTTP规范中提供的原生认证机制还是有必要了解下 xff0c 了解这些后才能更好理解那些自己建立的认证机制 HTTP原生认证功能一般分为基本认证和摘要认证 基本
  • Http权威指南笔记(十二)——实体与编码

    本章会对HTTP实体和编码进行学习 这里的实体是指HTTP中真正需要传输的实体内容 xff08 比如一张图片 xff0c 一份文档 xff09 这里的编码主要是指内容编码和传输编码 1 报文与实体 如果将HTTP对内容的传输比喻成实际生活中