1 HTTP通信传输
http是应用层的传输协议,依赖于传输层的TCP协议。
客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。报文从运用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。
- http请求包括:请求行、请求头、请求体
- http响应包括:响应行、响应头、响应体
2 HTTP请求报文
HTTP请求报文由3部分组成(请求行+请求头+请求体)
- 请求行和请求头加起来叫Header!
- 请求体又叫消息正文或实体(body)
(get请求没有请求体!)
2.1 请求行
例如:POST /chapter17/user.html HTTP/1.1
格式:请求方式 资源路径 协议/版本
请求行必须在http请求格式的第一行。
get请求:
- 将请求参数追加在url后面,不安全
- url长度限制get请求方式数据的大小
- 没有请求体!!!!
- 一般的HTTP请求大多都是GET。
post请求:
- 请求参数在请求体处,较安全。
- 请求数据大小没有显示
- 只有表单设置为method=“post”才是post请求,其他都是get请求
2.2 请求头
例如:Host: 39.108.107.149:8080
请求头从第二行开始,到第一个空格结束。请求头和请求体之间存在一个空格(如下)
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11
name=城市 #这不再是请求头,而是请求体。上面有空行
请求头通常以键值对{key:value}方式传递数据。
key为规范的固定值。
value为key对应的取值,通常是一个值,可能是一组。
常见请求头属性(key):
1、Host:要请求的服务器主机名
2、Accept:告诉服务端,该请求所能支持的响应数据类型,专业术语称为MIME 类型(文件类型的一种描述方式)
如:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
MIME格式:大类型/小类型[;参数]
例如:
- text/html,html文件
- text/css,css文件
- text/javascript,js文件
- image/*,所有图片文件
3、if-Modified-Sincce:浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存
4、Cokkie:客户端的Cookie就是通过这个报文头属性传给服务端的
5、User-Agent:浏览器通知服务器,客户端浏览器与操作系统相关信息
6、Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接,close已关闭
7、Referer:表示这个请求是从哪个url跳过来的,通过百度来搜索淘宝网,那么在进入淘宝网的请求报文中,Referer的值就是:www.baidu.com。如果是直接访问就不会有这个头。
8、Content-Length:请求体的长度。(客户端发送的请求体的长度)
9、Content-Type:请求的与请求体对应的MIME信息。如果是post请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码。
10、Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP压缩。
11、Accept-Language:浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)
12、Cache-Control:指定请求和响应遵循的缓存机制。
其他更多请求头属性参考其他文章。
2.3 请求体
当请求方式是post的时,请求体会有请求的参数,格式如下:
username=zhangsan&password=123
如:
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 20
content-type: application/x-www-form-urlencoded
name=城市&status=1 #请求体(url编码)
3 HTTP响应报文
HTTP的响应报文也由三部分组成(响应行+响应头+响应体)
示例:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E1352C5CCEAD7EA9A6F8DA253395781C; Path=/vk
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 26 Sep 2018 03:24:59 GMT
//此处有空格
{"sessionToken":null,"code":"1","msg":null,"service":"iModelServiceImpl","method":"findModelByType","key":null,"paras":{},"result":{"pageInfo":{"pageNum":1,"numPerPage":20,"totalCount":28,"pageNumShown":2,"startNum":0,"endNum":20}
3.1响应行:
报文协议及版本以及状态码和状态描述。
如:
HTTP/1.1 200 OK
状态码:由3位数字组成,第一个数字定义了响应的类别
1xx:指示信息,表示请求已接收,继续处理
2xx:成功,表示请求已被成功接受,处理。
- 200 OK:客户端请求成功
- 204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
- 206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容
3xx:重定向
- 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。
- 302 Found:临时重定向,表示请求的资源临时搬到了其他位置
- 303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问
- 307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET
- 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有
4xx:客户端错误
- 400 Bad Request:客户端请求有语法错误,服务器无法理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 404 Not Found:请求资源不存在。比如,输入了错误的url
- 415 Unsupported media type:不支持的媒体类型
5xx:服务器端错误,服务器未能实现合法的请求。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,
3.2 响应头
响应头也是用键值对k:v
服务器通过响应头来控制浏览器的行为,不同的头浏览器操作不同
常见请求头 | 描述 |
---|---|
Location | 指定响应的路径,需要与状态码302配合使用,完成跳转。 |
Content-Type | 响应正文的类型(MIME类型) |
Content-Disposition | 通过浏览器以下载方式解析正文 |
Set-Cookie | 与会话相关技术。服务器向浏览器写入cookie |
Content-Encoding | 服务器使用的压缩格式 |
Content-length | 响应正文的长度 |
Refresh | 定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页。 |
Server | 指的是服务器名称 |
Last-Modified | 服务器通知浏览器,文件的最后修改时间。 |
Cache-Control | 响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。常见的取值有常见的取值有private、public、no-cache、max-age,no-store,默认为private。缓存时间为31536000秒(365天) |
更多请求头属性可以参考其他文章。
Content-Type详解:
常见的Content-Type:
(以发请求为例)
Content-Type | 解释 |
---|---|
text/html | html格式 |
text/plain | 纯文本格式 |
text/css | CSS格式 |
text/javascript | js格式 |
image/gif | gif图片格式 |
image/jpeg | jpg图片格式 |
image/png | png图片格式 |
application/x-www-form-urlencoded | POST专用:普通的表单提交默认是通过这种方式。form表单数据被编码为key/value格式发送到服务器。 |
application/json | POST专用:用来告诉服务端消息主体是序列化后的 JSON 字符串 |
text/xml | POST专用:发送xml数据 |
multipart/form-data | POST专用:下面讲解 |
1、application/x-www-form-urlencoded
最常见的post提交数据的方式。浏览器原生的form表单,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded 方式提交数据。
示例:(使用postman为客户端)
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: 8e602802-b4f5-4d05-96d7-e1c7a1951719
User-Agent: PostmanRuntime/7.1.1
Accept: */*
Host: 39.108.107.149:8080
cookie: JSESSIONID=6CD80B7028062D9190717CEE001C3194
accept-encoding: gzip, deflate
content-length: 32
Connection: keep-alive
name=%E5%9F%8E%E5%B8%82&status=1
-
首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。
-
很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认「application/x-www-form-urlencoded;charset=utf-8」。
2、multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。(postman中只需要选择一下就可以了)
生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了body数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。
3、application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。**实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。**由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。 JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。
3.3 响应体
服务器发送给浏览器的正文,即我们真正要的“干货” ;
响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染 ,显示页面内容。