表单的POST与GET
服务器表单默认提交方式是POST
HTML表单默认提交方式是GET
选择GET方式提交时,表单内的所有表单元素的name属性和value值都出现在URL中,也就是说GET请求的数据会附在URL之后;
选择POST方式提交时,URL中不会出现任何表单元素,POST把提交的数据则放置在是HTTP包的包体(request-body)中;
这两种方式都是通过HTTP协议进行传递的,它们传递的数据均包含在HTTP头信息中;
GET方式在request-line中传送数据;POST方式在request-line及request-body中均可以传送数据。
这句话的理解为:GET通过在request-line中传送数据,但它只提交表单域中的数据,对于action标签属性中如果存在?子句它将不予处理(就是说在GET方式下指定表单的action标签属性中?子句是没用的)。
而POST方式传送数据时,表单域中的数据将作为request-body提交,action标签属性中的?子句将在request-line中得以保留(就是说同时可以用Request.QueryString方式获取action标签属性中?子句的数据)。
GET方式提交的数据最多只能是1024字节(其实是URL的长度限制),理论上POST没有限制;
当以GET方式发送表单时,发送的HTTP请求没有request-body部分,所以不需要指定enctype标签属性;
GET方式只提交表单域中的数据,action标签属性中如果存在?子句,GET方式将不予处理。
以GET方式提交表单时,每个表单域的NAME与VALUE要以URL的方式提交,所以每个表单域的NAME与VALUE均要进行URL Encoding处理。这个操作通常是由用户端浏览器完成的。
当以POST方式发送表单时,表单域中的数据将作为request-body提交,action标签属性中的?子句将在request-line中得以保留。
数据主体的编码方式
在HTTP请求中,request-line总是以application/x-www-form-urlencoded方式编码。
enctype标签属性只对request-body起作用。也就是说只有在method="POST"的情况下,设置enctype才起作用。
设置enctype标签属性后,在HTTP请求的头部(headers)信息中会多出一行Content-Type信息,并且request-body部分将会以Content-Type指定的MIME进行编码。这些操作都是由客户端浏览器自动完成的。
在没有指定enctype标签属性时,表单以默认的application/x-www-form-urlencoded方式对request-body进行编码,
如果表单中包含需要上传的文件数据,则在指定method="POST"的同时还要指定enctype="multipart/form-data";
以上内容参考资料:http://blog.csdn.net/darxin/article/details/4944225
特别提醒:如果是表单嵌套的情况,提交时会出现事件冒泡现象,值得注意!
附一个实验的例子:
<form method="GET" action="">
提交数据:
<input name="oStr" type="text">
<br>
提交方式:
<select name="select" onchange="this.form.method=this.value">
<option value="Post" selected>Post</option>
<option value="Get">Get</option>
</select>
<br>
<input type="submit" name="Submit" value="提交">
</form>
C#:
Response.Write("post:" + Request.Form["oStr"]);
Response.Write("<br/>get:" + Request.QueryString["oStr"]);