Get与POST的理解
针对GET& POST的掌握可以说是迷迷糊糊的,今天特意拿出来好好整理一下,便于掌握理解。
在服务器端都有一个用来标识资源位置的符号,被称为统一资源标识(URL)。
URI有两种形式。分别为URL何URN.
URL
统一资源定位符(URL,英语UniformResourceLocator的缩写)也被称为网页地址,是因特网上标准的资源的地址。
URL的格式由下列三部分组成: (协议)://(主机名):(端口号) / (文件路径)/(文件名)
第一部分是协议(或称为服务方式);
第二部分是存有该资源的主机IP地址(有时也包括端口号);
第三部分是主机资源的具体地址。,如目录和文件名等。
第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。现在几乎所有的URI都是URL。
URN
统一资源名称 (Uniform Resource Name, URN),唯一标识一个实体的标识符,但是不能给出实体的位置。系统可以先在本地寻找一个实体,在它试着在Web上找到该实体之前。它也允许Web位置改变,然而这个实体却还是能够被找到。URN 可以提供一种机制,用于查找和检索定义特定命名空间的架构文件。尽管普通的 URL 可以提供类似的功能,但是在这方面,URN 更加强大并且更容易管理,因为 URN 可以引用多个 URL。与 URL 不同,URN 与地址无关。URN 和 URL 都属于 URI。URN在web中主要应用是下拉菜单的制作。使用URN时下拉菜单的易扩展性将会得到很大的提高。
HTTP
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
(1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
* 注意:这里安全的含义仅仅是指是非修改信息。
(2).幂等的意味着对同一URL的多个请求应该返回同样的结果。
2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。
对于HTTP原理性的东西,人们在实际项目中并没有遵守:
1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。
2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。
3.另外一个是,早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。
GET & POST区别
1.请求数据的位置,
GET 请求会把请求的数据放在url的后面用?分割,提交的每一项使用&来分割,也就是将请求的数据放在请求的头部。如果是中文或者其他字符使用BASE64来加密;而POST借助form将请求的数据放在请求的请求体。
2.长度的限制
针对这个长度的限制,是非常有争议的说法。HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于URL长度上的限制,有两方面的原因造成:
a.浏览器。据说早期的浏览器会对URL长度做限制。据说IE对URL长度会限制在2048个字符内(统一认可)
b.服务器。URL长了,对服务器处理也是一种负担。
3.安全性
由于GET是将参数放在url的后面,直接暴露出来,所以会相对不安全。这是因为使用GET的数据可能会被缓存起来,这样就会导致所谓的不安全。知乎中总结的一些使用GET的场景:
- 请求中的URL可以被手动输入
- 请求中的URL是可以被搜索引擎收录的。
- 带云压缩的浏览器,比如Opera mini/Turbo 2, 只有GET才能在服务器端被预取的。
- 请求中的URL可以被缓存。
绝大部分的get请求会被CDN缓存,这样一来就会减缓服务的负载。
我们以一个实际的看一下请求报文:
①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL,③是协议名称及版本号。
①②③统称为请求行
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
⑤是报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
Web的结构部件
这里我们主要是先来了解几个基本的概念
1.代理:位于客户端和服务器之间的HTTP中间实体。他其实的作用就是接收HTTP请求。然后作为中间人在转发出去。它有可能对请求做一些改变也可能原封不动的转发出去。
2.缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。有了缓存之后可以加快HTTP请求的访问速度。如果一个请求被请求过。再次请求的时候去缓存中找。这样大大减小了服务器的压力。
3.网关:连接其他应用程序的特殊Web服务器。其实说白了,他就是一个转换网络协议的中间变量。假如它收到一个HTTP请求。这个可能访问的资源可能需要用到FTP协议请求所需资源。这时就要用到网关
4隧道:对HTTP通信报文进行盲转发的特殊代理。隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。 隧道这个概念我没有理解很透彻,还有些疑惑。希望对这个理解透彻的朋友讲解一下
5.Agent代理:发起自动HTTP请求的半智能Web客户端。我们目前大多数发起HTTP请求的web客服端都是基于浏览器。Agent代理就是一个自动发送HTTP请求的工具
【参考】
1.http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
2.http://blog.csdn.net/csh624366188/article/details/8568621
3。http://www.nowamagic.net/librarys/veda/detail/1919