1:HTTP服务器
1.首先,让我们先来了解一下http。
HTTP是一个用来进行传送内容和应用程序的应用层协议,它将TCP用作传输协议,并且是万维网进行数据通信的基础。首选的应用程序部署方案之一就是在互联网上提供HTTP服务,来响应HTTP客户端的请求。
2.那么如何在node中创建服务器呢?
var http=require("http");
var server=http.createServer();
server.on("request",function(req,res){
res.writeHead(200,{"Content-type":"text/plain"});
res.write("hello world!");
res.end();
});
server.listen(4000);
然后,将上述脚本保存为server.js并运行,如下所示:
$ node server.js
接着将浏览器转向http://localhost:4000,此时应该能看到”Hello World!”字符串显示在浏览器上。
当然上面的可以被简写为下面的程序:
require("http").createServer(function(req,res){
res.writeHead(200,{"Content-type":"text/plain"});
res.end("hello world!");
}).listen(4000);
3:理解http.ServerRequest对象
在监听request事件时,回调函数会得到一个http.ServerRequest对象作为第一个参数,这个对象包含一些属性,可以查看这些属性,这些属性包括url,method以及headers
(1)req.url:该属性包含一个字符串型的请求URL。它不包含模式,主机名或者端口,但包括URL中在上述内容之后的所有剩余部分,试着运行如下所示的服务器来分析request属性:
require("http").createServer(function(req,res){
res.writeHead(200,{"Content-type":"text/plain"});
res.end(req.url);
}).listen(4000);
用浏览器打开http://127.0.0.1:4000/abc,可以看到浏览器上输出的是/abc
(2)req.method:该属性包含在请求上用到的HTTP方法,例如,它有可能是GET,POST,DELETE或者HEAD。
(3)req.headers:该属性包含一个对象,这个对象拥有请求上所有的HTTP头,为了分析该属性,可以运行如下所示的服务器
var util=require("util");
require("http").createServer(function(req,res){
res.writeHead(200,{"Content-type":"text/plain"});
res.end(util.inspect(req.headers));
}).listen(4000);
将浏览器连接到http://127.0.0.1:4000来查看请求头,看以看到浏览器上输出这么一段信息:
{ host: '127.0.0.1:4000',
connection: 'keep-alive',
'cache-control': 'max-age=0',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.3.1.14600',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.8' }
在上面的代码中用到了util.inspect(),它是一个可以分析对象任意属性的使用函数。
header对象的键是小写的,例如,如果浏览器发送了一个请求头”Cache-Control:max-age=0”,则req.headers就会具有一个属性”cache-control”,该属性的值是”max-age=0”,值不会受到影响。
当在服务器上得到request事件时,并不会立即获得请求体,这只是因为请求体还没有到达。但因为request对象是可读流,所以只要你想,就可以监听data事件,或者将请求体传送到一个可写流中。
4:理解HTTP.ServerResponse对象
为了写入响应头,可以使用res.writeHead(status,headers)函数,其中headers是一个可选参数,它是一个包含所有想要发送的响应头属性的对象。
require("http").createServer(function(req,res){
res.writeHead(200,{
"Content-type":"text/plain",
"Cache-Control":"max-age=0=3600"
});
res.end("Hello world!");
}).listen(4000);
运行之后,我们可以在浏览器内打开控制台查看响应头。
5:修改或设置响应头
res.setHead(name,value);
上面的语句只有在还没有用res.write()或者res.end()发送响应主体时才会起作用,如果已经在响应对象上使用了res.writeHead(),上述语句也不会起作用,这是因为响应头已经被发送出去了。
6:删除响应头
res.removeHeader("Cache-Control");
再次提醒,上面的语句只会在响应头还未被发送出去时起作用。
7:写入一块响应主体
HTTP服务器会在发送响应头之后发送响应主体,有两种写入响应主体的方法,一是写入一个字符串:
res.write("hello");
另一种是使用已存在的缓冲区:
var buffer=new Buffer("hello world");
res.write(buffer);
今日博客写到这里,明天继续http服务器。