post 和 get 都是 HTTP 与服务器交互的方法。
一般在浏览器中输入网址访问资源都是通过 get 方式;在 form 表单中,可以通过 method 指定提交方式为 get 或者 post,默认为get 提交。注:用 post 必须要到 form表单中。
一个 url 地址,它用于描述一个网络上的资源, HTTP 中有4中与服务器的交互方法:get,post,put,delete 分别对应着对这个资源的查 ,改 ,增 ,删 4个操作。也就是,get一般用于查询/获取资源信息,post 用于更新资源信息,这应是二者最本质的区别。
根据 HTTP 规范,get 应该是安全的和幂等的 。所谓安全的意味着该操作用于获取信息而非修改信息,不会影响资源的状态;所谓幂等的意味着对同一URL的多个请求应该返回同样的结果。
---------------------------------------------------------------------------------------------------------------------------------
HTTP 请求的格式:
<request line>
<headers>
<blank line>
<request-body>
在 HTTP 请求中,第一行必须是一个请求行,用来说明请求类型、要访问的资源以及使用的 HTTP 版本。紧接着是一个首部小节,用来说明服务器要使用的附加信息。在首部之后是一个空行。再此之后可以添加任意的其他数据,称之为主体。
HTTP 请求的 get 方法示例:
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
HTTP 请求的 post 方法示例:
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive (----此处空一行----)
name=Professional%20Ajax&publisher=Wiley
---------------------------------------------------------------------------------------------------------------------------------
下面列举一下 get 和 post 的区别:
(1)url 格式
get 提交:提交的数据会附在 url 之后,就是把数据放置在请求行(request line)中,以?分割 url 和传输数据,多个参数用 & 连接,例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD,url 的编码格式采用的是ASCII 码,而不是 Unicode,这也就是说你不能在 url 中包含任何非 ASCII 字符,所有非ASCII字符均需要编码再传输。
post 提交:提交的数据不会显示在 url 中,而是放置在是 HTTP包 的包体中,上面示例中空行后的就是实际的传输数据。
实际上,以上区分并不是 HTTP 的规定,不是说 post 数据就要放在 body 中,get 数据就一定要放在 url 中。此等说法只是 HTML标准对 HTTP 协议的用法的约定。
(2)传输数据大小
首先声明:HTTP 协议没有对传输的数据大小进行限制,HTTP协议规范也没有对 url长度进行限制。但在实际开发中:
get:特定浏览器和服务器对 url 长度有限制,例如 IE 对URL长度的限制是2083字节(2K+35),对于其他浏览器,理论上没有长度限制,其限制取决于操作系统的支持。
post:由于不是通过 url 传值,理论上数据不受限,但实际各个 web 服务器会规定对 post 提交数据大小进行限制。
(3)安全性
post 的安全性要比 get 的高。比如:通过 get 提交数据,用户名和密码将明文出现在 url 上,因为登录页面有可能被浏览器缓存, 其他人查看浏览器的历史纪录,就可以拿到你的账号和密码了。除此之外,使用 get 提交数据还可能会造成 Cross-site request forgery 攻击。
---------------------------------------------------------------------------------------------------------------------------------
HTTP 响应格式:
<status line>
<headers>
<blank line>
<response-body>
与请求格式的区别在于第一行中用状态信息代替了请求信息,状态行(status line)通过提供一个状态码来说明所请求的资源情况。
HTTP 响应示例:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
常用的状态码:
◆200 (OK): 找到了该资源,并且一切正常。
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。