Appearance
HTTP的消息结构
一个HTTP请求被分为请求和响应,请求是指客户端发起的请求,而响应则是服务器根据业务逻辑在接收客户端发送的数据,经过处理后返回给客户端的数据。所以,消息结构便被分为两种,请求消息和响应消息。这是完成整个数据交换的必经过程,HTTP 消息是客户端和服务器之间通信的基础。
请求消息和响应消息的数据结构是不同的,请求消息是定义客户端发起的请求所包含的信息,服务端根据收到的请求消息进一步处理,从而生成标准的响应消息给客户端。无论是请求还是响应,消息结构都要遵循规范。
请求消息
在不同的客户端中,如浏览器,CURL请求,或者自定义的请求类,发送的消息结构都有所差异,但往往这些差异并不改变消息结构的本身,决定这些差异的是业务场景。如浏览器发起请求时,消息体中可能包含统一的Request Header,这些Header中包含的信息有Origin、Host、Cookie、Cache-Control等。有的数据是浏览器生成,开发者无法修改请求消息中的这些数据,而在客户端自定义HTTP-CLIENT时,这些消息可以被开发者自己定义传入。
请求行
在一个基础的请求中,一定会包含请求行。请求行是请求消息的起始部分,请求头是请求消息的辅助部分,请求体是请求消息的主体部分。请求行由请求方法、请求URI、HTTP版本组成,如:
bash
GET /index.html HTTP/1.1
方法:如 GET、POST、PUT、DELETE等,指定要执行的操作。
URI(统一资源标识符):请求的资源路径,通常包括主机名、端口号(如果非默认)、路径和查询字符串。
HTTP 版本:如 HTTP/1.1 或 HTTP/2,这将告知服务端以什么版本兼容返回。
无聊使用什么方法请求,请求行都是必须存在的消息内容。
请求头Request Headers
在请求过程中,Request Headers中将携带诸多十分有用的信息到服务端,这些信息是服务端进一步处理的依据。Request Headers可以被自定义,但是有的数据在不同客户端中自动生成,如浏览器等。无论是那种请求方法,都会携带。但是不同浏览器生成的Request Headers可能有所差,服务端兼容时需要特别注意。客户端请求头中,可能会包含如下信息:
- Accept:浏览器可接收的媒体类型,如text/html,application/json等。
- Accept-Encoding:浏览器可接收的编码格式,如gzip,deflate等。
- Accept-Language:浏览器可接收的语言,如en-US,zh-CN等。
- Connection:浏览器与服务器之间的连接类型,如keep-alive,close等。
- Cookie:浏览器发送的Cookie信息。
- Host:请求的主机名,如www.jkkf.cn。
- User-Agent: 浏览器的用户代理信息。
- Referer:请求的来源地址。
- Content-Type:请求体的数据类型,如application/json,application/x-www-form-urlencoded等。
- Content-Length:请求体的数据长度。
- Authorization:请求的认证信息,如Basic Auth,Bearer Token等。
以上信息是我们常见的浏览器请求头包含的信息,在实际业务中,我们还可以自定义,但部分数据浏览器考虑到安全,是不允许客户端软件自定义的,当请求发起时,被自动计算并合并入Request Headers中进行传输。
请求体Request Body
在处理POST/PUT请求时,需要将数据封装到请求体中,如表单数据,JSON数据等。请求体中,可以携带任意数据,如表单数据,JSON数据,二进制文件等。但这是可选的。
空行
在HTTP通信中,空行(CRLF)是指由一个回车符(\r)和一个换行符(\n)组成的字符序列。它在HTTP请求和响应中起着关键作用。空行位于HTTP请求的头信息(Headers)之后,请求体(Request Body)之前,它的作用是分隔请求头信息和请求体,使得服务器能够明确区分这两部分内容,空行之后,如果存在请求体,则包含请求体内容。
响应消息
响应消息与请求消息对应,是服务端处理客户端请求后,下发的消息报文,有了这些报文,客户端便可以根据服务器返回的数据进行逻辑处理,如返回html、图片、JSON等。
响应消息中,包含响应头和响应体。
状态行
状态行由HTTP版本、状态码和状态码描述(状态信息)组成,如:
bash
HTTP/1.1 200 OK
HTTP版本:如HTTP/1.1或HTTP/2,这将是客户端与服务器之间通信的版本。
状态码:如200、404、500等,这将是服务器端根据业务逻辑返回的状态码。参考状态码
状态信息:是响应状态码对应的Status Text
响应头(Response Headers):
响应头中,将携带服务端返回的响应信息,如Content-Type、Content-Length、Content-Encoding、Set-Cookie等。
- Content-Type:响应体的数据类型,如text/html,application/json等。
- Content-Length:响应体的数据长度。
- Content-Encoding:响应体的编码格式,如gzip,deflate等。
- Set-Cookie:服务端设置的Cookie信息。
- Location:重定向的地址。
- Access-Control-Allow-Headers: 允许的请求头,用于处理浏览器跨域。
- Access-Control-Allow-Methods: 允许的请求方法。
- Access-Control-Allow-Origin: 允许的请求源。
- Access-Control-Allow-Credentials: 是否允许发送Cookie。
- Access-Control-Expose-Headers: 允许暴露的响应头。
- Access-Control-Max-Age: 预检请求的有效期。
- Access-Control-Allow-Credentials: 是否允许发送Cookie。
- Strict-Transport-Security: 服务器端设置的HSTS信息。
- X-Frame-Options: 服务器端设置的X-Frame-Options信息。
- X-XSS-Protection: 服务器端设置的X-XSS-Protection信息。
- X-Content-Type-Options: 服务器端设置的X-Content-Type-Options信息。
- X-Powered-By: 服务器端设置的X-Powered-By信息。
- X-Request-Id: 服务器端设置的X-Request-Id信息。
以上的信息Content-Type将告知客户端本次响应返回的数据类型,即IMEI,客户端根据标识进行处理,如HTML则渲染为网页,图片则作为图片渲染。
空行
响应消息同样包含空行,在HTTP通信中,空行(CRLF)是指由一个回车符(\r)和一个换行符(\n)组成的字符序列。它在HTTP请求和响应中起着关键作用。空行位于HTTP响应的头信息(Headers)之后,响应体(Response Body)之前,它的作用是分隔请求头信息和请求体,使得服务器能够明确区分这两部分内容,空行之后,如果存在响应体,则包含响应体内容。
响应体(Response Body)
响应体中,将携带服务端返回的数据,如html、图片、JSON等。
总结
在实际的应用过程中,HTTP的响应结构不会发生变化,主要变化的应该是响应的数据内容。但无论是响应内容和请求内容的标准化使用都至关重要,标准化的使用能让HTTP请求在不同客户端中得到较好的适配,因为HTTP的请求链优化,是服务端和客户端共同作用的结果。
遵循标准使用HTTP协议,无论是在CDN适配,网站开发,接口开发还是浏览量器对实际业务场景的优化,都能够得到更好的受益。