本来所写的是关于本人所理解的http基础,由于http协议复杂,任何一点都可以作为单独文章,由于本人水平有限欢迎拍砖

Http请求报文格式

http 请求报文分为三个部分 请求行,请求头,请求体,格式如图:

1724103-c43900117e983241.png

ps : 部分文章也将http请求报文分为请求头和请求体,请求头的第一行为请求行。

1.1 请求行 请求行(Request Line) 分为三部分:请求方法 请求地址 和协议及版本,以CRLF(/r/n) 结束。

Http /1.1 定义的请求方法有8种: GET POST PUT DELETE PATCH HEAD OPTIONS TRACE,最常用的有两种 get post ,如果是RESTful 接口的话一般会用到get post put delete

在了解请求地址之前,先了解下url 的构成:

http://localhost/index.html?key1=valueq&key2=valuew
协议   主机       路径           参数
protocol host    path          query string

PATH 是url主机以后的部分,即包含了 query string 如:

URL                                   PATH
http://www.jianshu.com/     /
http://localhost:8080/index.php?id=1   /index.php?id=1
  1. Http响应报文格式 Http响应的格式上除状态行(第一行) 与请求的请求行不一样以外,其它就格式而言是一样的,但排除状态行和请求行的区别,从Header上还是能区分出http请求和http响应的,怎么区分就要看前面的常见Header

1724103-e8ebcab6c80b9044.png

状态吗 的详细可以查看Http状态码详解

  1. Header Header 可用于传递一些附加信息,格式 : key: value,
    Content-Length:1024
    Content-Tye:text/lain
    

    3.1 请求和响应常见通用Header

名称作用
Content-Type请求体的响应类型,如: text/plain,application/json
Accept说明接收的类型,可以多个值,用, 分开
Content-Length请求体/响应提的长度,单位字节
Content-Encoding请求体/响应体的编码格式,如gzip,deflate
Accept-Encoding告知对方我方接收的Content-Encoding
ETag给当前资源的表示,和Last-Modified, If-None-Match, if_Modified-SInse 配合,用于缓存控制
Cache-Contral取值一般为 no-cache 或max-age=xx ,xx为整数,表示该资源缓存有效期(秒)

3.2 常见的请求Header

名称作用
Authorization用于设置身份认证信息
User-Agent用户标识,如: OS和浏览器的类型和版本
if-Modified-SInce值为上一次服务器返回的 Last-Modified 值,用于确认某个资源是否被更改过,没有更改过(304)就从缓存中读取
if-None_Match值为上一次服务器返回的ETag值,一般会和If-Modified-Since 一起出现
Cookie已有的Cookie
Referer表示请求引用哪个地址,比如你从页面A 跳转到页面B时,值为页面A的地址
Host请求的主机和端口号

3.3 常见响应的Header 名称| 作用 —- | — Date | 服务器的日期 Last-Modified | 该资源最后被修改时间 Transfer-Encoding | 取值为一般为chunked ,出现在content-Length 不能确定的情况下,表示服务器不知道响应版本的数据大小,一般同事还会出现Content-Encoding 响应头 Set-Cookie | 设置Cookie Location | 重定向到另一个URL,如输入浏览器就baidu.com 回车,会自动跳转到https://www.baidu.com 就是通过这个像迎头控制的

  1. 请求体的3种形式 根据使用场景的不同,Http请求的请求体会有三种不同的形式

    第一种

    移动开发者常见的,请求体是任意类型,服务器不会解析请求体,请求体的处理需自己解析,如POST JSON时候就是这类

1724103-ebe4ae9308d92ca0.png

第二种

第二种和第三种都是有固定格式的,是服务器开发人员最先了解到的两种,这里的格式要求就是URL 的query string格式要求: 多个键值对之间用&连接,键与值之间用= 连接,并且只能有ASCII字符,非ASCII字符需要使用UrlEncode 编码

1724103-18847d9a34c50bdd.png

第三种

第三种请求体的请求体被分成多个部分,文件上传会被使用,这种格式最先应该是被用于邮件传输中,每个字段/文件都被boundary(Content-Type种指定) 分成单独的段,每段以– 加 boundary 开头 , 然后是该段的描述头,描述头之后空一行接内瓤,请求头结束的标志为boundary 后面加boundary,结构如下:

1724103-f764903c4ae2408a.png

区分是否被当作文件的关键是 Content-Disposition是否包含filename ,因为文件有不同的类型,所以还要使用Content-Type 指示文件的类型,如果不知道是什么类型取值可以为application/octet-stream 表示文件还是个二进制文件,如果不是文件则Content-Type 可以省略。

注意

第二三种请求体需要结合特定的Content-Type 请求头,如: 第二种配合Content-Type:application/x-www-urlendcoded 第三种配合Content-Type:multipart/form-data;boundary={boundary}, 上面的form-data 也可以是 mixed,alternative digest parallel 但我只用到了 form-data 如果两者没有相结合,那么服务器不会解析请求体,也就是说只会当成第一种情况

表单或者模拟表单 指的就是第二种和第三种(multpart/form-data)

  1. 调试工具 cUrl相当强大命令行工具,基本上你知道的上层协议它都支持,具体使用方法就自行发现了,下图为发起一个HTTP GET请求并打印请求和响应的详细内容。

5.2 bat bat 是astaxie(谢孟军) 用Golang开发的类似cURL的命令行API调试工具,可以方便的打印出HTTP请求和响应,还能高亮Header、格式化JSON等功能,非常好用,API调式神器。

  1. Http 的组成图示

1724103-ea242640383ed739.jpg ⤧  Next post 自定义注解 ⤧  Previous post View事件分发简要分析