`
hcw1314520
  • 浏览: 7179 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

淺談 HTTP Method:表單中的 GET 與 POST 有什麼差別?

阅读更多
个人技术博客:http://www.cooli.cc/

Introduction

會寫這篇文章的原因為某位正在念書的同學向我提出的疑問,讓我發現 HTTP Method 的觀念其實在現在的教育中相當缺乏。以往經驗,大部分的學校課程都會直接傳授網頁程式設計等課程,卻忽略這十年來最廣泛使用的 HTTP 協定。

GET 與 POST 有寫過網頁表單的人一定不陌生,但你了解什麼是 GET 與 POST 嗎!? 現今的網頁設計工具相當的發達,甚至不需要接觸 HTML 語法就能完成一個規模不小的網站,漸漸地很多人都忘記了 HTTP 底層的實作原理,造成在發生錯誤的情況下無法正確進行偵錯。

早期在撰寫 HTML 表單語法時,都會寫到以下的寫法,然而大部分的程式設計師都會採用 POST 進行表單傳送。

<form action="" method="POST/GET">
</form>
然而在我們的網頁程式中要獲取表單的變數只需要呼叫系統已經封裝好的方法即可,像是 PHP 使用 $_REQUEST、JAVA 使用 getParameter()、ASP 使用 Request.Form() 這些方法等等。
由上述的方法看來,似乎用 POST 或 GET 好像不是很重要。許多網頁程式設計師對於表單 method 用法的記憶為"POST可以傳送比較多的資料"、"表單傳送檔案的時候要使用 POST"、"POST比GET安全"等等奇怪的概念。

What’s HTTP Method ??

其實使用 POST 或 GET 其實是有差別的,我們先說明一下 HTTP Method,在 HTTP 1.1 的版本中定義了八種 Method (方法),如下所示:

OPTIONS
GET
HEAD
POST
PUT
DELETE
TRACE
CONNECT
天阿,這些方法看起來真是陌生。而我們使用的表單只用了其中兩個方法 (GET/POST),其他的方法確實很少用到,但是在 RESTful 的設計架構中就會使用到更多的 Method 來簡化設計,有機會再與大家介紹。

GET vs POST Method

先舉個例子,如果 HTTP 代表現在我們現實生活中寄信的機制,那麼信封的撰寫格式就是 HTTP。我們姑且將信封外的內容稱為 http-header,信封內的書信稱為 message-body,那麼 HTTP Method 就是你要告訴郵差的寄信規則。

假設 GET 表示信封內不得裝信件的寄送方式(空信封),你可以把要傳遞的資訊寫在信封(http-header)上,寫滿為止,價格比較便宜。然而 POST 就是信封內有裝信件的寄送方式(信封有內容物),不但信封可以寫東西,信封內(message-body)還可以置入你想要寄送的資料或檔案,價格較貴。

使用 GET 的時候我們直接將要傳送的資料以 Query String(一種Key/Vaule的編碼方式)加在我們要寄送的地址(URL)後面,然後交給郵差傳送。使用 POST 的時候則是將寄送地址(URL)寫在信封上,另外將要傳送的資料寫在另一張信紙後,將信紙放到信封裡面,交給郵差傳送。

接著我來介紹一下實際的運作情況:

我們先來看看 GET 怎麼傳送資料的,當我們送出一個 GET 表單時,如下範例:

<form method="get" action="">
    <input type="text" name="id" />
    <input type="submit" />
</form>
當表單 Submit 之後瀏覽器的網址就變成 "http://xxx.toright.com/?id=010101″,瀏覽器會自動將表單內容轉為 Query String 加在 URL 進行連線。

這時後來看一下 HTTP Request 封包的內容:

GET /?id=010101 HTTP/1.1
Host: xxx.toright.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 115
Connection: keep-alive
在 HTTP GET Method 中是不允許在 message-body 中傳遞資料的,因為是 GET 嘛,就是要取資料的意思。

從瀏覽器的網址列就可以看見我們表單要傳送的資料,若是要傳送密碼豈不是"一覽無遺"…….這就是大家常提到安全性問題。

再來看看 POST 傳送資料

<form method="post" action="">
    <input type="text" name="id" />
    <input type="submit" />
</form>
網址列沒有變化,那我們來看一下 HTTP Request 封包的內容:

POST / HTTP/1.1
Host: xxx.toright.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 115
Connection: keep-alive

Content-Type: application/x-www-form-urlencoded
</code><code>Content-Length: 9
id=020202
看出個所以然了嗎?原來 POST 是將表單資料放在 message-body 進行傳送,在不偷看封包的情況下似乎安全一些些…….-_- 此外在傳送檔案的時候會使用 multipart 編碼,將檔案與其他的表單欄位一併放在 message-body 中進行傳送。這就是 GET 與 POST 的差異。

src:http://blog.toright.com/?p=1203
分享到:
评论

相关推荐

    Web应用安全:HTTP协议GET和POST的使用区别实验.docx

    实验一:HTTP协议POST 实验目的 通过ajax实例深入理解http协议之post方法。 二、实验用到的工具软件 ...&lt;form action="a2.php" name="form1" method="post"&gt; 姓名: 年龄: &lt;input type="submit" value="

    Form表单中method=post/get两种数据传输的方式的区别

    Form提供了两种数据传输的方式—get和post,Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法,感兴趣的朋友可以了解下,或许对你学习get/post有所帮助

    HTML中Form表单的method属性使用介绍

    1 method是指定数据如何发送到服务器的一个属性 2 只可能是post和get post:官方解释是把数据通过post会话传送到服务器。实际就是提交数据。 get:将表单中数据的按照variable=value的形式,添加到action所指向的URL...

    浅谈PHP表单提交(POST&GET&URL编/解码)

    表单中method属性的默认方法。使用GET方法提交的表单数据被附加到URL上,并作为URL的一部分发送到服务器端。 注意:若要使用GET方法发送表单,URL的长度应限制在1MB字符以内。如果发送的数据量太大,数据将被截断,...

    HTML5&CSS3网页制作:创建表单.pptx

    method属性用于设置表单数据的提交方式,其取值为get或post。 method属性 name属性用于指定表单的名称,以区分同一个页面中的多个表单。 name属性 autocomplete属性用于指定表单是否有自动完成功能。 autocomplete...

    c# http请求、POST文件帮助类

    包括普通POST\GET\FILE形式。 获取HTML:var hp = new HttpHelper("http://www.cnblogs.com"); hp.Send(); 发送POST:var hp = new HttpHelper("http://www.cnblogs.com/upload",HttpMethod.POST); hp.AddPostData...

    动态设置form表单的action属性的值的简单方法

    form name="myform" id="myform" action="ssss" method="post" onsubmit="getUrl();"&gt; javascript方法: [removed] function getUrl(){ $('form').attr('action','new_url'); } [removed] 或者用单纯的...

    ASP.NET之表单和控件详解

    主要介绍的有如下知识点: HTML表单的提交方式、HTM控件、获取HTML表单内容、乱码问题、SQL注入、服务器端表单、HTML服务器控件 HTML表单的提交方式 对于一个普通HTML表单来说,它有两个...它有两个可能值get和post。

    理解JavaScript表单的基础知识

    HTMLFormElement继承了HTMLElement,它自己独有的属性和方法有: ... method:要发送的HTTP请求类型,通常是get或post name:表单的名称 reset():将所有表单域重置为默认值 submit():提交表单 targ

    nodejs之get/post请求的几种方式小结

    最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法: (1)get方法 前端代码: &lt;form action = /login method = GET&gt; ...

    浅析get与post的一些特殊情况

    下面就从几个例子将有关get与post的相关内容进行测试,首先看一下最简单的 &lt;html&gt; &lt;body&gt; &lt;?php echo $_GET ['param']; ?&gt; &lt;form action="get_post_test.php?param=aaa" method="get"&gt; &...

    c# http post get

    * *描 述:实现HTTP协议中的GET、POST请求 * *使 用:HttpProc.WebClient client = new HttpProc.WebClient(); client.Encoding = System.Text.Encoding.Default;//默认编码方式,根据需要设置其他类型 client....

    前端与移动开发之表单

    ②method提交表单数据的方式 get(提交时有地址)/post(提交时隐藏地址) 4.表单元素 input输入表单元素 文本框/password密码框 /radio单选框/checkbox复选框/ name定义input元素名称/value/checked/...

    html表单制作及多种实例

    action属性定义了当表单提交时数据发送的位置,method属性定义了数据发送的方式(GET或POST)。 • &lt;label&gt;: 定义一个用户可读的描述,为输入字段提供描述信息。 • &lt;input&gt;: 用于用户输入的元素。type属性定义了...

    关于html的表单元素详解(一)

    HTML 表单用于搜集不同类型的用户输入 HTML 表单用于收集用户输入;...method 属性规定在提交表单时所用的 HTTP 方法(GET 或 POST): 何时使用 GET? 您能够使用 GET(默认方法): 如果表单提交是被动的(比如搜

    javascript模拟post提交隐藏地址栏的参数

    通过js模拟post提交 1:请求需要的参数过长,超过get允许的最大长度 ...myForm.method='POST'; var input = document.createElement('input'); input.type = 'text'; input.name = 'userId'; input.

    asp.net页面与页面之间传参数值方法(post传值和get传值)

    form id=”form1″ runat=”server” action=”receive.aspx” method=post&gt;  ”Button1″ runat=”server” xss=removed Text=”Button”&gt;”username” runat=”server”&gt;&lt;/asp&gt;&lt;/div&gt;&lt;/form&gt; 接受asp...

    JavaScript获取网页表单提交方式的方法

    JavaScript获取网页表单的提交方式是get还是post,获取提交方式可以通过表单的method属性获得 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;form id=frm1 action=form_action.asp method=get&gt; First name:...

    XMLHTTP实现HTTPS+post登录

    strcat(buf,"/&return_method=get&more;_param=&return;_type=&psp_tt=0&password;="); strcat(buf,MySpace_Pass); //登录密码 strcat(buf,"&safeflg=0&username;="); strcat(buf,MySpace_User); //登录...

    python+requests+pytest 接口自动化框架(6)

    2.在request下必需包含:method,url 3.传参方式: 3.1.get请求,那么必须通过params传参 3.2.post请求 传json格式,需要使用json传参 传表单格式,需要使用data传参 3.3.文件上传:使用files传参 4.接口关联 ...

Global site tag (gtag.js) - Google Analytics