文章目录
简述
本文不做基础普及,希望对用过HTTP但觉得不熟悉的人有所帮助,同时我也不对很多细节做太多描述,仅仅对HTTP4要素以及我们常见的传参方式进行讲解,最重要的是我会举实实在在的例子来表达,我学习的时候看了很多文章,了解的感觉不是特别清楚,直到我按照这种方式方式去学习了一下,就完完全全明白了,希望你也可以。
注:本文内容节选与我的另外一篇关于HttpUtils的文章,感觉可以独立出来。
关于Http的基本标准
这边我对Http的基本知识不做太多普及,仅讲述和我设计有关的相关知识。
Http的四要素
众所周知,Http是基于TCP,而TCP是用来传输数据的,说得再通俗一些,就是用来传递字符串的。那么这个字符串到底要如何传递以及如何解析,这就是应用层协议需要设计的,我们平时见到的应用层协议都是围绕“如何来传递字符串”这个目标然后实现的(如何传递也意味着如何解析),Http也是,它的标准就是4要素,或者是4块内容。
- 请求行
请求行占了一行,格式是:方法 请求地址 HTTP/版本号
后面中间分别有1个空格 - 请求头
这个是多行,每一行都是key:value的形式 - 空行
就是一个空行,用于区分请求头和请求体 - 请求体
请求体就是我们常说的body或者form部分了。这个行数不定,那如何知道结尾了呢?就要用请求头里面所标记的Content-Length来判断了,用一些框架在解析的时候,如何发现Length的长度和请求体的长度不一致的时候,就会出现异常。包括接收Http请求或者请求http的时候。
对于Http的响应也是这4要素。
四要素举例
光看上面的解释,其实还是比较抽象的,我举几个平时最常见的例子,一目了然。对了,我都是用postman做的测试。
最常见的get请求
GET /http/get?arg=123 HTTP/1.1
name: xiaopang
Host: localhost:8080
get请求,没有请求体。
普通字符串的post请求
POST /http/post/string?arg=123 HTTP/1.1
name: xiaopang
Content-Type: text/plain
Host: localhost:8080
content-length: 4
test
这个相对与之前的增加了3个地方。
请求头增加了Content-Type:text/plain,这个就是告诉接收方我发送的就是普通的字符串,不用特殊处理。
关于这个参数多说一点点,这个看你使用的web框架,会不会用这个,有的根本不会用。
增加了请求体,因此也有了conten-length,这个长度它指的是字节。
普通form表单的post请求
我们经常也会用这种的,就是以key-value的方式去提交表单。都是普通的字符串,这种form我们都称之为“application/x-www-form-urlencoded”。
POST /http/post/form-simple?arg=123&arg1=456 HTTP/1.1
name: xiaopang
content-type: application/x-www-form-urlencoded
content-length: 15
name=ywg&age=25
这种的其实还是比较常见的,这边我传递了两个参数,name和age,但是你注意看第一行,我还传递了两个参数arg和arg1,你会发现和请求体里面的格式特别像。这也就解释了为什么叫做form-urlencoded了,form代表了它是表单形式,在请求体里面,同时我还标记了一下它的方式仍然是按照url参数来传递的。
在url后面跟着的key-value形式的参数,我们一般称之为url参数户或者查询参数(query),我比较喜欢称之为查询参数,叫做query。对于这些一般传递的时候都会encode一下,解析的时候需要decode一下。
multi-form(多表单)的post请求
我们这边以传递一个字符串和一个文件为例:
POST /http/post/form-multi?arg=123&arg1=456 HTTP/1.1
name: xiaopang
cache-control: no-cache
Host: localhost