`
hcw1314520
  • 浏览: 7445 次
  • 性别: 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方法的理解,掌握POST方法与GET方法的不同之处,特别是它们如何在Web应用中被使用以及在安全性方面有何差异。 #### 实验工具介绍 - **Firefox的Firebug插件**:Firebug是一...

    html中_的method=post和method=get的区别

    ### HTML中的Method=post和Method=get的区别详解 #### 一、简要分析 1. **GET与POST的本质区别**: - GET:主要用于从服务器获取数据,数据被附加在URL之后,用户可以直接在URL中看到这些数据。 - POST:主要...

    浅析Get与Post的区别

    浅析Get与Post的区别 Get和Post是两种常用的表单提交方式,在Web开发中经常被使用。但是,很多人并不了解这两种方式的区别,导致在实际开发中出现问题。本文将详细阐述Get和Post的区别,以便读者更好地理解和使用这...

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

    在HTML表单中,`method`属性用于定义数据提交的方式,主要有两种选择:`GET`和``POST`。这两种方法在数据传输过程中与HTTP协议的GET和POST方法紧密相关,各自具有不同的特点和用途。 1. GET方法: - GET主要用于从...

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

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

    get和post的区别

    ### GET与POST方法的区别 在Web开发中,GET与POST是最常见的两种HTTP请求方式,它们在功能、安全性、数据传输等方面存在显著差异。本文将基于提供的文件内容对这两种方法进行详细解析。 #### 1. 基本概念 - **GET...

    Servlet表单Get和Post方式读取

    在这个"Servlet表单Get和Post方式读取"的主题中,我们将深入探讨如何使用Servlet来接收和处理来自HTML表单的GET和POST请求。 首先,让我们了解GET和POST这两种HTTP方法的基本概念: 1. GET方法:这是HTTP请求中最...

    jsp中post和get传输方式的区别

    ### jsp中post和get传输方式的区别 在Web开发领域,特别是使用Java Server Pages (JSP) 进行网页开发时,GET与POST是两种最常见的HTTP请求方法。这两种方法各有其适用场景及特点,理解它们之间的区别对于提高网站的...

    html页面模式get/post请求

    通过设置`method`属性,我们可以指定表单使用GET还是POST方式提交数据。例如: ```html &lt;form action="your-api-url" method="post"&gt; &lt;!-- 输入字段 --&gt; &lt;!-- 提交按钮 --&gt; 提交 ``` 对于POST请求,特别是...

    GET与POST请求DEMO

    在iOS开发中,网络编程是不可或缺的一部分,而GET和POST是最常见的两种HTTP请求方式。本文将深入探讨这两种请求方法,并通过实例演示它们在iOS中的应用。 GET请求是HTTP协议中最基本的一种请求方法,用于从服务器...

    vs2010中应用get,post与http通信实例

    在这个实例中,我们将深入探讨如何在VS2010中使用C#进行HTTP通信,主要关注GET和POST方法。这两种方法是HTTP协议中最基础且广泛使用的请求类型,用于客户端(如浏览器或应用程序)与服务器之间的数据交换。 GET方法...

    get、post、request的区别

    其次,`$_POST`变量则是在表单提交时使用,特别是当表单的`method`属性设置为`POST`时。POST请求将数据隐藏在HTTP请求的主体中,不会出现在URL中,因此可以传输大量数据且更适用于包含敏感信息的情况。POST请求的...

    HTTPGet与Post的区别[归类].pdf

    在表单中,如果不指定method属性,浏览器会默认使用GET方法。然而,为了确保数据的安全性和正确性,开发者通常会根据需求选择使用POST方法。 需要注意的是,虽然POST方法相对更安全,但并不意味着绝对安全。任何...

    C# post方式提交Form表单

    总结,C#通过`HttpClient`类提供了一种简单而强大的方式来实现POST提交表单,这在Web API、Web服务和其他需要与服务器交互的应用中非常常见。了解并熟练掌握这一技术,对于提升C#开发者在网络编程领域的技能至关重要...

    关于HTML的Form的get和post

    当用户填写完表单并提交后,浏览器会按照指定的`method`以GET或POST方式向服务器发送请求,服务器根据请求类型处理相应的逻辑。 在给定的压缩包文件“helloform”中,可能包含了一个简单的HTML表单示例,用于演示...

    Nginx服务器中使用lua获取get或post参数.docx

    Nginx服务器中使用lua获取get或post参数 在Nginx服务器中,使用lua获取get或post参数是通过ngx_lua模块来实现的。ngx_lua模块是Nginx的一个第三方模块,提供了在Nginx中使用Lua语言的能力。 首先,我们可以使用ngx...

    C# Http Post Get

    ### C# 中实现 HTTP GET 和 POST 请求 在 C# 编程语言中,根据 HTTP 协议创建 GET 和 POST 方式的 HTTP 请求是一项基本且重要的技能。以下是对如何使用 C# 创建这两种请求的具体介绍。 #### 一、理解 HTTP GET ...

    Python实现简单的HTTP服务器(GET/POST)

    在IT行业中,Python是一种广泛应用的编程语言,尤其在Web开发领域。本文将深入探讨如何使用Python实现一个简单的HTTP服务器,支持GET和POST请求。通过理解这个过程,你可以更好地理解网络通信的基本原理,以及Python...

    计算机病毒与防护:PHP表单处理(POST).ppt

    1. **数据不显示**:与GET请求不同,POST请求的数据不会出现在浏览器的URL地址栏中,这有助于保护敏感信息。 2. **无大小限制**:POST请求可以携带大量数据,而GET请求通常受限于URL长度。 3. **安全传输**:由于...

Global site tag (gtag.js) - Google Analytics