HTTP篇-----Get和Post

本文详细解析了GET和POST方法的区别,包括语义、安全性、幂等性及缓存策略,强调了GET的只读特性与POST的修改行为。同时,讨论了如何根据实际场景灵活运用这两种方法,并提到了HTTPS的重要性。

一、Get和Post的区别

Get的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片和视频等。

他的参数一般位于URL中,URL规定只能支持ASCII,所以Get字符只允许ASCII字符。

Post的语义是根据请求负荷(报文body)对指定的资源做出处理,具体处理方式视资源类型不同。

Post请求携带数据的位置一般是写在报文body中,body中的数据可以任意格式的数据,只要客户端和服务器端协商好,且不会做出大小限制。

二、安全和等幂的概念

安全:指请求方法不会破坏服务器的资源;

等幂:多次执行相同的操作,结果都是相同的。

从这个角度看,
Get方法都是安全且等幂的,因为Get是只读操作,无论操作多少次,服务器的数据都是安全的,且结果不会有变化。

所以可对Get请求的数据做缓存,这个缓存可以做到浏览器本身,也可以做到代理服务器上,浏览器中Get请求可以保存为书签。

Post是**【新增或提交数据】的操作,会修改服务器资源, 所以是不安全的**,且多次提交会创建多个资源,所以不是等幂的

so,浏览器不会缓存Post的请求,也不能把Post请求保存为书签。

Get请求示例:

在这里插入图片描述
请求行:

GET /search/users?q=JakeWharton HTTP/1.1

URL为 /search/users?q=JakeWharton,协议为HTTP1.1。

请求行下面均为请求头部,可以看到host为api.github.com,连接方式为长连接。

该例子是不存在请求数据的。

Post请求示例:

在这里插入图片描述Post请求中,URL为空,协议版本为HTTP1.1.

与Get不同在于,它的请求参数是位于数据中的,可以看到name=Professional%20Ajax&publisher=Wiley就是它的请求数据,且请求数据和请求头部之间需要空出一行。

对于 GET 和 POST 的区别,总结来说就是:它们的本质都是 TCP 链接,并无区别。但是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中可能会有所不同。

小结:

GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。

POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。

这些概念都是从RFC规范定义的语义来分析的。
实际过程中,可以用Get来实现新增或修改数据的请求,也可以用Post实现查询数据的请求。
而且安全如果放入概念是信息不会被泄露,那Get请求在URL中传输,而Post在body中传输,明显URL中更容易被看到数据,所以并不能说Get一定比Post安全。
想要避免传输过程数据不被窃取,就要使用HTTPS协议,这样的HTTP数据会被加密传输。

问题1:GET 请求可以带 body 吗?

答:RFC 规范并没有规定 GET 请求不能带 body 的。理论上,任何请求都可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。

另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值