HTTP请求报文和响应报文是什么样的?
我去,以前都没怎么研究过这个。
客户端发送一个请求给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放到响应报文中返回给客户端。
URL
HTTP使用URL (Uniform Resource Locator,统一资源定位符)来定位资源,它是URI(统一资源标识符)的子集,URL在URI的基础上增加了定位能力。URI除了包括URL外,还包括URN(统一资源名称),URN只是用来定义一个资源的名称,并不具备定位该资源的能力。
请求报文结构:
第一行包含了请求方法,URL,协议版本
接下来多行都是请求首部Header,每个首部都有一个首部名称,以及对应的值。
接下来用一个空行分隔Header和主体内容Body
最后就是请求的内容主体
GET http://www.example.com/ HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Host: www.example.com
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947+gzip"
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 xxx
param1=1¶m2=2
响应报文结构:
第一行包含了协议版本,状态码以及描述,这里的200 OK表示请求成功了。
接下来多行也是首部内容
还是用空行来分隔首部和主体
最后是响应的内容主体
HTTP/1.1 200 OK
Age: 529651
Cache-Control: max-age=604800
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 648
Content-Type: text/html; charset=UTF-8
Date: Mon, 02 Nov 2020 17:53:39 GMT
Etag: "3147526947+ident+gzip"
Expires: Mon, 09 Nov 2020 17:53:39 GMT
Keep-Alive: timeout=4
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Proxy-Connection: keep-alive
Server: ECS (sjc/16DF)
Vary: Accept-Encoding
X-Cache: HIT
<!doctype html>
<html>
<head>
<title>Example Domain</title>
// 省略...
</body>
</html>
HTTP请求的方式有哪些
我去,居然有9中方法。
GET方法:获取资源。当前网络请求中,绝大部分使用GET方法。
HEAD方法:获取响应报文的header(首部)。和GET方法类似,但是不返回报文实体主体部分。主要用于确认URL的有效性以及资源更新的日期时间。
POST方法:传输实体主体。POST方法主要用来传数据,而GET方法主要用来获取资源。
PUT方法:上传文件。由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
PATCH方法:对资源部分进行部分修改。PUT也可以用于修改资源,但是只能完全替代原始资源,PATCH允许部分修改。
DELETE方法:与PUT功能相反,并且同样不带验证机制。
OPTIONS方法:查询支持的方法。查询指定的URL能够支持的方法,会返回
Allow: GET,POST,HEAD,OPTIONS
这样的内容。
CONNECT方法:在与代理服务通信时建立隧道。使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
TRACE方法:追踪路径。服务器会将通信路径返回给客户端。发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器就会减1,当数值为0时就会停止传输。但通常不会使用TRACE,英文它容易收到XST攻击(跨站追踪)
GET请求和POST请求的区别
作用:
GET用于请求资源,POST用于传输实体主体。
参数:
GET和POST的请求都可以使用额外的参数。但是GET的参数是以查询字符串的方式出现在URL中,而POST的参数存储在实体主体中。不能因为POST参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(例如Fiddler)查看。
因为URL只支持ASCII码,因此GET的参数中如果存在中文等字符就需要先进性编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。POST 参数支持标准字符集。
安全:
安全的HTTP方法不会改变服务器状态,也就是说它是可读的。
GET方法是安全的,而POST却不是,因为POST方法的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
安全的方法有:GET,HEAD,OPTIONS
不安全的方法有:POST,PUT,DELETE,PATCH,TRACE。
幂等性:
幂等的HTTP方法:即同样的请求被执行一次或多次的效果是一样的,服务器的状态也是一样的。也就是说幂等方法不具有副作用。
所以所有的安全方法都是幂等的。
在正确实现的条件下,GET,HEAD,PUT,DELETE等方法都是幂等的,但POST不是。
可缓存:
如果要对响应进行缓存,需要满足以下条件:
- 请求报文的HTTP方法本身是可以缓存的,包括GET和HEAD,但是PUT和DELETE不可缓存,POST在多数条件下不可缓存。
- 响应报文的状态码是可以缓存的,包括:200,203,204,206,300,301,404,405,410,414,501
- 响应报文的Cache-Control首部字段没有指定不进行缓存。
XMLHttpRequest
XMLHttpRequest:
XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过URL来获取数据的方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest在AJAX中被大量使用。
在使用XMLHttpRequest的POST方法时,浏览器会先发送Header再发送Data。但不是所有的浏览器都会这么做。例如火狐就不会。
而GET方法Header和Data会一起发送。