1.一个HTTP请求只处理一个资源
一个HTTP包含Header和Body两部分,其中Body是可选的
Body的数据类型由Content-Type
头来确定,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据
当存在Content-Encoding
时,Body数据是被压缩的,最常见的压缩方式是gzip,所以,看到Content-Encoding: gzip
时,需要将Body数据先解压缩,才能得到真正的数据。压缩的目的在于减少Body的大小,加快网络传输。
2.node.js中 http
模块有request
和response
对象
request
对象封装了HTTP请求,我们调用request
对象的属性和方法就可以拿到所有HTTP请求的信息;
response
对象封装了HTTP响应,我们操作response
对象的方法,就可以把HTTP响应返回给浏览器。
实现一个简单的HTTP服务器程序:
'use strict'; // 导入http模块: var http = require('http'); // 创建http server,并传入回调函数: var server = http.createServer(function (request, response) { // 回调函数接收request和response对象, // 获得HTTP请求的method和url: console.log(request.method + ': ' + request.url); // 将HTTP响应200写入response, 同时设置Content-Type: text/html: response.writeHead(200, {'Content-Type': 'text/html'}); // 将HTTP响应的HTML内容写入response: response.end('<h1>Hello world!</h1>'); }); // 让服务器监听8080端口: server.listen(8080); console.log('Server is running at http://127.0.0.1:8080/');
3.url
模块通过parse()
将一个字符串解析为一个Url
对象:
'use strict'; 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' } */
4.path
模块可以方便地构造目录:
'use strict'; var path = require('path'); // 解析当前目录: var workDir = path.resolve('.'); // 组合完整的文件路径:当前目录+'pub'+'index.html': var filePath = path.join(workDir, 'pub', 'index.html'); // '当前目录/pub/index.html' (不一定存在)
5.实现一个文件服务器file_server.js
:
'use strict'; var fs = require('fs'), url = require('url'), path = require('path'), http = require('http'); // 从命令行参数获取root目录,默认是当前目录: 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); // 发送404响应: response.writeHead(404); response.end('404 Not Found'); } }); }); server.listen(8080); console.log('Server is running at http://127.0.0.1:8080/');
可以把/path/to/dir
改成你本地的一个有效的目录,且拥有index.html。命令行运行node file_server.js /path/to/dir,
然后在浏览器中输入http://localhost:8080/index.html,在本地服务器中运行。
6.crypto模块的目的是为了提供通用的加密和哈希算法。
MD5是一种常用的哈希算法:
const crypto = require('crypto'); const hash = crypto.createHash('md5'); // 可任意多次调用update(): hash.update('Hello, world!'); hash.update('Hello, nodejs!'); console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544
如果要计算SHA1,只需要把'md5'
改成'sha1'
7.Hmac算法也是一种哈希算法:
const crypto = require('crypto'); const hmac = crypto.createHmac('sha256', 'secret-key'); //需要一个密钥,密钥不同的话,结果也不同 hmac.update('Hello, world!'); hmac.update('Hello, nodejs!'); console.log(hmac.digest('hex')); // 80f7e22570...
AES是一种常用的对称加密算法,加解密都用同一个密钥。
DH算法是一种密钥交换协议,它可以让双方在不泄漏密钥的情况下协商出一个密钥来。