2010年9月25日 星期六

漫談HTTP

HTTP 全名就是Hyper Text Transfer Protocol
也就是我們最常用triple w, 電火,電鍋,電冰箱前面加的前置符號http://
://是用來和後面的domain name有所區分,至於為什麼要用//而不用/就好呢?
最近www的老爸 Time Berners-Lee 說:好像真得不必要用兩個/ 請參見
而在HTTP中最常用到GET 和 POST 這兩個Method
先來說說GET Method
如果我們在瀏覽器的網址打上http://www.scentsome.com/index.html?name=michael
Browser會幫我們把下方的訊息傳給 www.scentsome.com這台電腦

GET /index.html?name=michael  HTTP/1.1
Host: 127.0.0.1:3000
User-Agent: Mozilla/5.0 Gecko/20100914 Firefox/3.6.10
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

這個又叫做GET Request ,而GET 之後從Host開始叫做Header,標頭
因為www是client-server 的架構,一般都是由client請一個請求給server,server再回一個Response給client
這個是response的Header
HTTP/1.1 200
Date: Fri, 24 Sep 2010 14:52:36 GMT
Etag: "61b4e760d49edcc77c565ce63e1e7a09"
Content-Type: text/html; charset=utf-8
X-Runtime: 2
Content-Length: 13
Cache-Control: private, max-age=0, must-revalidate
對於GET來說呢,通常我們只關心
?name=michael
這個代表的是我們把name這個參數和michael這個參數值傳給server
在Server那就可以把name參數值取出來,達到動態依參數改變行為的目的
在Ruby on Rail
     params['name']
在PHP
    $_GET['name']
來得到michael這個值

至於什麼時候我們什麼時候會用改變Header的值呢?
這想我們就要提到POST method
一個最常見的例子就是from 表單
相信大家都有填過帳號/密碼的頁面吧?
這個頁就是用HTML form tag寫成的,
當大家把傳送/確認按鈕接下時,
Browser就會用POST 把資料傳到Server
POST Request 就有分兩個部分
Request Header
POST Body
Header 裡有個
Content-Type: application/x-www-form-urlencoded
預設就是冒號右邊那一串
如果是這種Type
Key-Value 這種配對的值
Name: Jonathan Doe
Age: 23
Formula: a + b == 13%!
就會被編碼成

Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21
送出去,感覺就和GET一樣只是有編碼過不是用明文傳送

當我們要上傳檔案到server的時候就不像GET這麼簡單,幾個key-value的配對就好了
用程式連結HTTP Server的時候我們就要手動去更改POST Header的值好讓server知道我們要做的動作是上傳檔案,我們要傳給它的不是一個value而是一個file,一個binary file.
此時的Content-Type:就要用
Content-Type: multipart/form-data

接著在Body的地方也要手動給一些值
我們來看一個上傳file的POST Body要長什麼樣子
Content-Disposition: form-data; name="token"; filename="file.bin"
Content-Type: application/octet-stream


[file binary......]
-----------------------------19277021961952509530130060903
藍色的部分都是要和Server 溝通時,很重要的設定,不然server是會搞不清楚現在要傳的東西是什麼。
注意:要上傳的binary檔要緊接在Content-Type 之後,而且整個POST Body都要轉成用binary傳出去,不是用string
所以如果不是用HTML或是一些現成的tool去做的話,我們的程式裡面就要有可以去設定這些值的method來完成事情
最後,介紹一個很好用的tool給大家
Firebug : http://getfirebug.com/
對於firefox上的addons,用來觀察網頁元素和Request / Response之間傳遞了什麼訊息很方便的工具
不知道什麼時候會移到safari extension
雖然safari本來就有類似的
但還是firebug 好用

沒有留言:

張貼留言