衆所周知,HTTP協議,也稱爲超文本傳輸協議,全部web程序都是基於HTTP。
HTTP工做原理: 客戶端與服務器端創建鏈接,完成信息交互
舉個例子說明:咱們要登陸網易163看看最近的新聞,在瀏覽器上輸入http://
www.163.com,敲下回車,瀏覽器上返回網易的內容。
客戶端與服務器端之間的交互,按照如下步驟完成
第一步:客戶端(手機端/PC端)發送請求,這些請求的信息按照HTTP協議的標準格式組織:
GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)
以上信息稱爲請求頭
其中:
GET / HTTP/1.1
包含了URI和HTTP請求的方法,這裏的"GET"是HTTP請求,HTTP/1.1是傳輸協議
URI是客戶端用來識別資源的惟一地址或者定位
Host: xkcd.com
請求目的地址
Accept: text/html
接收信息的格式,text/html是指接收html的文本格式
User-Agent: Mozilla/5.0 (Macintosh)
識別發出請求的應用程序,
Mozilla/5.0 指的是firefox瀏覽器
HTTP請求分爲如下幾個方式:
GET
Retrieve the resource from the server
POST
Create a resource on the server
PUT
Update the resource on the server
DELETE
Delete the resource from the server
備註:HTTP的請求方式實際上有9種,他們大部分都不經常使用,並且如今部分的瀏覽器不支持put和delete
第二步:服務器端返回響應,響應信息
一樣按照HTTP協議的標準格式返回:
一旦服務器接收到請求,則會根據URI信息以及請求的方式(如GET)識別出用戶所須要的信息,而後向客戶端發送響應頭信息,客戶接收後處理,將響應的內容顯示在客戶端上。
響應頭信息:
HTTP/1.1 200 OK
HTTP狀態碼,經過狀態可知響應是否成功或失敗,不一樣狀態碼返回信息不一樣,這裏不作詳細解釋,可經過一下連接查看
http://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81 中文
Date: Sat, 02 Apr 2011 21:05:05 GMT
返回的時間
Server: lighttpd/1.4.19
經過什麼服務器返回
Content-Type: text/html
返回的格式(如xml, json, html)
備註:在Firefox瀏覽器上安裝firebug插件能夠查看請求和響應的內容
============================================
經過PHP實現簡單的HTTP請求和響應:
$uri = $_SERVER['REQUEST_URI'];
$foo = $_GET['foo'];
header('Content-type: text/html');
echo 'The URI requested is: '.$uri;
echo 'The value of the "foo" parameter is: '.$foo;
請求頭:
GET / HTTP/1.1
Host: localhost:83
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)
響應頭:
HTTP/1.1 200 OK
Date: Sat, 03 Apr 2011 02:14:33 GMT
Server: Apache/2.2.17 (Unix)
Content-Type: text/html
============================================
來看看Symfony2是如何實現HTTP的請求和響應:
1.請求
use Symfony\Component\HttpFoundation\Request;
//訪問請求類的命名空間
$request = Request::createFromGlobals();
//從請求的資源中去掉請求參數(?foo=xxx)
$request->getPathInfo();
//分別獲取GET,POST參數
$request->query->get('foo');
$request->request->get('bar', 'default value if bar does not exist');
// 獲取$_SERVER的值
$request->server->get('HTTP_HOST');
// 獲取文件上傳
$request->files->get('foo');
// 獲取COOKIES值
$request->cookies->get('PHPSESSID');
// 獲取
請求
頭信息
$request->headers->get('host');
$request->headers->get('content_type');
$request->getMethod();
// GET, POST, PUT, DELETE, HEAD
2.響應
use Symfony\Component\HttpFoundation\Response;
//
訪問響應類的命名空間
$response = new Response();
$response->setContent('<html><body><h1>Hello world!</h1></body></html>');
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/html');
$response->send();