nodejs基本模块(三)

http模块
a. 首先我们先简单了解一下http协议,在web应用中服务器把页面传递给浏览器,其实是把HTML代码传递给浏览器,浏览器和服务器之间的传输协议是HTTP。HTML是一种用来定义网页的文本,HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。
b.HTTP请求的流程:
步骤1:浏览器首先向服务器发送HTTP请求,请求包括:
方法:GET还是POST,GET仅请求资源,POST会附带用户数据;
路径:/full/url/path;
域名:由Host头指定:Host: www.sina.com.cn
以及其他相关的Header;
如果是POST,那么请求还包括一个Body,包含用户数据。

步骤2:服务器向浏览器返回HTTP响应,响应包括:
响应代码:200表示成功,3xx表示重定向,4xx表示客户端发送的请求有错误,5xx表示服务器端处理时发生了错误;
响应类型:由Content-Type指定,例如:Content-Type: text/html;charset=utf-8表示响应类型是HTML文本,并且编码是UTF-8,Content-Type: image/jpeg表示响应类型是JPEG格式的图片;
以及其他相关的Header;
通常服务器的HTTP响应会携带内容,也就是有一个Body,包含响应的内容,网页的HTML源码就在Body中。

步骤3:如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复步骤1、2。
Web采用的HTTP协议采用了非常简单的请求-响应模式,从而大大简化了开发。当我们编写一个页面时,我们只需要在HTTP响应中把HTML发送出去,不需要考虑如何附带图片、视频等,浏览器如果需要请求图片和视频,它会发送另一个HTTP请求,因此,一个HTTP请求只处理一个资源。HTTP协议同时具备极强的扩展性,虽然浏览器请求的是http://www.sina.com.cn/的首页,但是新浪在HTML中可以链入其他服务器的资源,比如

<img src="http://i1.sinaimg.cn/home/2013/1008/U8455P30DT20131008135420.png">

,从而将请求压力分散到各个服务器上,并且,一个站点可以链接到其他站点,无数个站点互相链接起来,就形成了World Wide Web,简称“三达不溜”(WWW)。

HTTP格式

每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。
HTTP协议是一种文本协议,所以,它的格式也非常简单。HTTP GET请求的格式:

GET /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

每个Header一行一个,换行符是\r\n。

POST请求的格式:

POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body。

HTTP响应的格式:

200 OK
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

HTTP响应如果包含body,也是通过\r\n\r\n来分隔的。请再次注意,Body的数据类型由Content-Type头来确定,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据。

当存在Content-Encoding时,Body数据是被压缩的,最常见的压缩方式是gzip,所以,看到Content-Encoding: gzip时,需要将Body数据先解压缩,才能得到真正的数据。压缩的目的在于减少Body的大小,加快网络传输。

http模块

1、要开发HTTP服务器程序,从头处理TCP连接,解析HTTP是不现实的。这些工作实际上已经由Node.js自带的http模块完成了。应用程序并不直接和HTTP协议打交道,而是操作http模块提供的requestresponse对象。
2、 request对象封装了HTTP请求,我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息;
3、response对象封装了HTTP响应,我们操作response对象的方法,就可以把HTTP响应返回给浏览器。

第一个node.js服务器从程序:

'use strick'
var http = require('http');//引入http模块

var server = http.createServer(function(request,response){//创建http服务,传入回调函数,回调函数接收request和response对象
    console.log(request.method+':'+request.url) //获取http请求的 方法和 url
    response.writeHead(200,{'Content-Type': 'text/html'})//将HTTP响应200写入response, 同时设置Content-Type: text/html:
    response.end('<h1>hello world</h1>')//将HTTP响应的HTML内容写入response:
});

server.listen(8989)//服务器监听端口
console.log('Server is running at http://127.0.0.1:8080');
//console.log('hello')

黑窗口输入以下命令会输出以下结果:

D:\nodejsworkspace\http>node helloworld.js
Server is running at http://127.0.0.1:8080
GET:/
GET:/favicon.ico 

文件服务器
我们可以设定一个目录,然后让Web程序变成一个文件服务器。要实现这一点,我们只需要解析request.url中的路径,然后在本地找到对应的文件,把文件内容发送出去就可以了。

解析URL需要用到Node.js提供的url模块,它使用起来非常简单,通过parse()将一个字符串解析为一个Url对象:

'use stick'
var url = require('url')
console.log(url.parse('http://user:pass@host.com:8080/path/to/file?query=string#hash'))
Url {
  protocol: 'http:',
  slashes: true,
  auth: 'user:pass',
  host: 'host.com:8080',
  port: '8080',
  hostname: 'host.com',
  hash: '#hash',
  search: '?query=string',
  query: 'query=string',
  pathname: '/path/to/file',
  path: '/path/to/file?query=string',
  href: 'http://user:pass@host.com:8080/path/to/file?query=string#hash' }

处理本地文件目录需要Node.js提供path模块,方便构造目录:

'use strick';
var path = require('path');
var workdir = path.resolve(".");//获取当前目录(例如:现在所在目录是D://A,获取的filePath就是当前目录下的这个路径。)
var file = path.join(workdir,'pub','index.html');

创建文件服务系统

'use strict';

var
    fs = require('fs'),
    url = require('url'),
    path = require('path'),
    http = require('http');

// 从命令行参数获取root目录,默认是当前目录: (其实就是自己设置的nodejs的工作空间所在的目录)
var root = path.resolve(process.argv[2] || '.');

console.log('Static root dir: ' + root);

// 创建服务器:
var server = http.createServer(function (request, response) {
    // 获得URL的path,类似 '/css/bootstrap.css':
    var pathname = url.parse(request.url).pathname;
    // 获得对应的本地文件路径,类似 '/srv/www/css/bootstrap.css':
    var filepath = path.join(root, pathname);
    // 获取文件状态:
    fs.stat(filepath, function (err, stats) {
        if (!err && stats.isFile()) {
            // 没有出错并且文件存在:
            console.log('200 ' + request.url);
            // 发送200响应:
            response.writeHead(200);
            // 将文件流导向response:
            fs.createReadStream(filepath).pipe(response);
        } else {
            // 出错了或者文件不存在:
            console.log('404 ' + request.url);
            console.log(err)
            // 发送404响应:
            response.writeHead(404);
            response.end('404 Not Found');
        }
    });
});

server.listen(8999);

console.log('Server is running at http://127.0.0.1:8999/');

不需要手动读取文件内容,因为response本身就是一个writable stream,直接使用pip()就可以将文件的内容输出到http响应。
黑窗口执行以下命令(在当前编辑js的目录下)
node file_server.js /static
浏览器访问的时候:
在这里插入图片描述
黑窗口出现的结果

D:\nodejsworkspace\http>node file_server.js /static
D:\static
/static
Static root dir: D:\static
Server is running at http://127.0.0.1:8999/
200 /index.html
404 /css/uikit.min.css

说明访问成功,注意要引入静态资源。比引入的话也可以访问到,到时黑窗口会像博主的这样出现404。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值