众所周知,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();