1
post,get这两个HTTP的请求方式,在刚开始接触HTTP协议的时候,我傻傻分不清,那时候还不断吐槽学编程就去学语言啊!为什么还学这种鬼东西哦!
直到我看到了这么一张图:
我才明白,原来我们平常的上网过程就是客户端与远程服务端交互的过程啊。
但是这又跟HTTP有什么关系呢?那必然是有关系的啊!
首先我们先来简单了解一下啥叫HTTP。
HTTP是一种超文本传输协议,是一种基于TCP应用层,将服务端的数据传输给客户端的一种协议。
所以我们现在可以知道,平常我们上网获取的图片,文字,视频等数据都是由HTTP协议进行传递的。
讲到这里,也许有同学会问一个问题:
啥是服务端,啥又是客户端啊?
我觉得这是一个好问题,对于小白来说,他们确实不知道啥是客户端,啥是服务端,在这里我也想厚脸皮的说一句,其实我原来也不知道…
所以为了解决小白们的疑惑,我也来简单介绍一下吧。
客户端嘛,是与服务端相对应的词,客户客户,就是一个被服务的对象,所以用一句话来说就是:客户端是产品或者服务所指向的终点。
像上图中的电脑,手机都是客户端,准确的来说,它们内部的应用程序才是客户端,因为这些应用程序都有一个与其相对应的服务端给它们提供服务。
既然初步了解客户端,那么我们也就知道了,向客户端提供服务,保存客户端数据的叫作服务端。
2
在了解客户端和服务端后,让我们再次回到客户端与服务端的交互过程中来。
之前说了每一个客户端,都有着与其相对应的服务端。那么我们不得不思考一个问题。
这么多的客户端该如何才能找到与之对应的服务端呢?
在这里不得不说HTTP协议是真的伟大,针对上面这个问题,HTTP协议本就有着解决方案。
客户端与服务端要交互,前提就是要建立一个连接。而HTTP协议中的URL就起到了这个作用。
URL叫做统一资源定位器,HTTP使用它来传递数据与建立连接。
互联网上的每一个资源都有一个唯一的URL,URL用来指出它们存放的地址。
简单来说,URL可以大致分为协议部分,域名部分,文件名部分。
其实你也可以理解为:URL就是网址
假设我们要在我们的浏览器上访问百度,那么我们现在用的浏览器就是客户端,而要访问的百度,就是服务端。
之后我们在地址栏中输入http://www.baidu.com,很明显,这个http://www.baidu.com就是URL。
可以看出这个URL由协议部分(HTTP协议)和域名部分也就是服务器部分(www.baidu.com)组成。
下面再来看一下这个地址:
http://www.swpan.com/my/photo/1.jpg
这个URL就很棒了,由三部分组成,除了协议和域名部分,还多了一个文件名部分。这个文件名部分,用来指明你获取的是服务端什么路径下的什么文件。
像这里就是获取服务端,my/photo/下面的1.jpg 文件。
3
想必大家也发现了,上图中的那个两个单词吧。
request,response
这两个单词的意思分别是请求和响应的意思。
所以结合HTTP协议,我们就可以晓得。
request 是客户端通过HTTP发送一个请求消息给服务器
respones 是服务器接收客户端发过来的请求,并返回一个HTTP响应消息。
关于request和response方面的东西,我今天先不说了,下次有机会再单独写篇文章介绍这两个玩意。
我接下来要说的的就是开头提起的post和get。
我们在客户端请求服务端的时候,HTTP协议定义了好几种请求的方法:
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。TRACE 回显服务器收到的请求,主要用于测试或诊断。
而我们用到最多的就是post和get这两种请求方法。
这两个都可以作为HTTP中请求的方法,那么它们之间有什么区别呢?
下面我就简单来说一下这两个玩意的区别,让大家对他们熟悉起来。
4
我们先来看一下W3C的解释:
GET
有关 GET 请求的其他一些注释: GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET
请求不应在处理敏感数据时使用 GET 请求有长度限制 GET 请求只应当用于取回数据
POST
有关 POST 请求的其他一些注释: POST 请求不会被缓存 POST 请求不会保留在浏览器历史记录中 POST 不能被收藏为书签
POST 请求对数据长度没有要求
官方的解释其实已经把重要的几点都指出来了,下面我就再补充一点,以及做一些解释。
虽然都是提交方法,但是get在提交的时候,提交内容都会连在URL后面,显示在网址栏中,可以被看到。所以安全性有所降低,所以一般做web开发,提交用户密码时等一些敏感操作时,都不会用get这个方法。
post请求的内容不会出现在URL后面,也不会出现在历史记录中,它传递的参数只出现在request body中,我们是看不到的(除非抓包),所以它时候用来做一些敏感操作。
最后再解释一下,get请求长度并没有规定要多长,之所以长度受限制,是因为浏览器的缘故,不同的浏览器的URL的长度都有着规定,所以get的请求信息加在URL后方时,自然就要因为浏览器而受限制了。