表单的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"]);

posted @ 2018-10-08 16:42  skybirdzw  阅读(373)  评论(0编辑  收藏  举报