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可以被存在书签里,或者历史里,或者快速拨号里面,或者分享给别人。
  - 请求中的URL是可以被搜索引擎收录的。
  - 带云压缩的浏览器,比如Opera mini/Turbo 2, 只有GET才能在服务器端被预取的。
  - 请求中的URL可以被缓存。

  绝大部分的get请求会被CDN缓存,这样一来就会减缓服务的负载。
 
报文
  一个HTTP请求报文由请求行(request line)、请求头部(header)和请求数据3个部分组成, HTTP有两类报文:请求报文和响应报文。请求和响应报文顾名思义,一个是web客户端发送请求时响应的HTTp 报文,一个是web服务器响应式响应的Http报文。其实他们的格式都是相同的。

我们以一个实际的看一下请求报文:  


①是请求方法,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

posted @ 2016-03-08 16:37  平林新袖  阅读(628)  评论(0编辑  收藏  举报