您的位置:首页 > Web前端 > HTML

HTML表单(HTML Form)中get 和post 的区别

2011-09-09 14:15 351 查看
当用户在 HTML 表单 (HTML Form) 中输入信息并提交之后,有两种方法将信息从浏览器传送到 Web 服务器 (Web Server)。

一种方法是通过 URL,另外一种是在 HTTP Request 的 body 中。

前一种方法,我们使用 HTML Form 中的
method = "get"
,后一种方法我们使用 HTML Form 中的
method ="post"


例句如下:

<form action = "..." method = "get">

<from action = "..." method = "post">

通过 get 或者 post 方法都可以获得 Form 的数据,两者主要区别在于以下几方面:

Get

URL 改变,在URL 里显示 HTML Form 参数的 name/value 值。
只适合有少量参数的 HTML Form,因为 URL 长度有字符限制,不能无限长。
涉及安全性的信息,比如用户密码,不能用 get,因为会在 URL 上显示,不安全。

Post

URL 不改变,不在 URL 里显示 HTML Form 的数据。
Form 提交的信息没有长度限制。
涉及安全性的信息,如用户密码,应采用 post 方式。

我们看看 get 是如何提交 Form 数据的。我们先写一个 HTML 文件,如下:

<html>
<head><title>Blablar.com HTML Form Method Get Example</title></head>
<body>
<form action ="get.php" method ="get">
Name: <input type="text" name="username" />
<input type ="submit" value="ok" />
</form>
</body>
</html>

该 HTML 的显示界面如下:



当你在这个 HTML 文件的表单文本框输入框里输入姓名,比如 "Jacky",然后鼠标点击ok 按钮,会跳转到 get.php,在 get.php 里会显示如下图。



你可以看到在浏览器地址栏里的URL是:

http://localhost:8080/get.php?username=Jacky

注意
get.php
后面的字符串
?username=Jacky
,这是一对 name/value 数据,前面加一个问号。

如果你将 form 改成
method = "post"
,你在浏览器地址栏就看不到这对 name/value 数据,而只有:

http://localhost:8080/get.php

使用 get 时,第一对 name/value 值前要加一个问号
?
,以后每对 name/value 值则要用
&
分开
。比如一个 form中有三个参数,如下:

<form action ="u.php" method ="get">
Name: <input type="text" name="username" />
Age: <input type="text" name="age" />
Gender: <input type="text" name="gender" /><input type ="submit" value="ok" /></form>

比如你在Name 项填写Jacky,Age项填写50,Gender项填了male,提交之后的 URL 显示为:

http://localhost:8080/get.php?username=Jacky&age=50&gender=male

=====================================================================================================================================================

在B/S应用程序中,前台与后台的数据交互,都是通过HTMLForm表单完成的。Form提供了两种数据传输的方式——get和post。虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响。虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的。
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。
下面我们一个实例来查看二者的不同:

Username:

Password:

//接受数据的Servlet文件
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ParseServlet
extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request, HttpServletResponse response) throws
IOException, ServletException {
System.out.println("************** begin ***************");
String method = request.getMethod();
System.out.println("method        = " + method);
int contentLength = request.getContentLength();
System.out.println("contentLength = " + contentLength);
System.out.println("ContentType   = " + request.getContentType());
//System.out.println("-------  在设定字符编码前  -------");
System.out.println("QueryString   = " + request.getQueryString());
//得到ServletInputStream,请注意:这段代码和得到user的值的代码,不能同时出现,否则
//在后面的那个将会得到空值。
if (method.equalsIgnoreCase("Post")) {
try {
ServletInputStream ins = request.getInputStream();
byte[] arr = new byte[contentLength];
while (ins.read() != -1)
ins.read(arr, 0, contentLength);
System.out.println("content       = " + new String(arr));
} catch (IOException e) {}
}

//得到user的值
//System.out.println("Username = " + request.getParameter("user"));
//设置字符编码,必须放在得到ServletInputStream或者得到user的值的代码之前,否则将起不
//到转化编码的作用。
try {
request.setCharacterEncoding("gb2312");
} catch (UnsupportedEncodingException use) {}
//System.out.println("-------  在设定字符编码后  -------");
//得到user的值
//System.out.println("Username = " + request.getParameter("user"));
//System.out.println("QueryString = " + request.getQueryString());
System.out.println("************** end ***************");
}
}
首先,我们设置form的method="post",提交数据,则可以得到如下的结果:



从结果中可以看到,QueryString为null,而content是输入的值,并且按照variable=value的形式组织,而且变量之间使用“&”连接,这和结果中的另外一个变量(ContentType)有关。在后面将会提到ContentType的有关概念。
接着,我们将form中的method设置为get,重新提交数据,则可以得到如下的结果:



可以看到,QueryString的值正是我们在页面上的变量及其对应值,而此时ContentLength=-1。从以上的结果,我们可以清楚地看到,Get和Post分别将数据放在不同的位置来传输。我们还可以将程序中注释去掉,观察一下,在Get和Post下设置字符编码对数据的影响,会发现:使用Post传输的数据,可以通过设置编码的方式正确转化中文;而Get传输的数据却没有变化。在以后的程序中,我们一定要注意这一点。
下面简单介绍一下ContentType,它和Form中enctype属性的相对应,它是Form用来组织数据的方式,主要包含了两种:
1、application/x-www-form-urlencoded:它是默认内容类型(content type),在结果中我们已经看到了经它编码的数据的效果。编码方法:i.将空格使用“+”代替,非字母和数字字符,是用以%HH表示的该字符的ASCII代替(汉字就是这种形式);ii.变量和值使用“=”,各个变量和值对之间使用“&”连接。
2、multipart/form-data:它可以用来传输大量二进制数据或者非ASCII字符的文本,因此在上传文件需设置enctype="multipart/form-data",此时method必须为post。它传输的消息包含了一系列的数据块,每一块都代表Form中的一个变量,并且数据块的顺序和页面上的顺序一致,块与块之间使用特殊字符(boundary)分隔。如果Form中包含file控件,相应的数据块还会包含一个Content-Type头,用来指定MIME,默认值为text/plain。下面是设置enctype="multipart/form-data"时content的结果:



点击查看大图
此时在Servlet中,使用常规getParameter(String)方法已经不能到值,至于如何解析,可以参考文件上传的程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: