<
NodeJs 核心模块使用
>
上一篇

NodeJs 扩展功能
下一篇

NodeJs 基本模块使用

第六天学习

  1. http协议
  2. url 的使用
  3. path 的使用
  4. 搭建http服务器
  5. crypto 加密功能使用

http协议

sina-http-request

GET / HTTP/1.1
GET表示一个读取请求,将从服务器获得网页数据, / 表示URL的路径,URL总是以/开头,/ 就表示首页,最后的HTTP/1.1 指示采用的HTTP协议版本是1.1。目前HTTP协议的版本就是1.1, 1.1 与 1.0的区别在于允许多个HTTP请求复用一个TCP连接,以加快传输速度。

HOST: www.sina.com.cn
表示浏览器请求的域名是www.sina.com.cn。服务器通过Host来区分浏览器请求的是哪个网站

sina-http-response

HTTP响应分为Header 和 Body两部分(Body是可选项)Header最重要的几行如下:

200 ok

200 表示一个成功的响应。

失败的响应有404 Not Found: 网页不存在。

500 Internal Server Error: 服务器内部出错,等等。

Content-Type: text/html

Content-Type 指示响应的内容,text/html 表示HTML网页。

浏览器是依靠 Content-Type 来判断响应的内容是网页还是图片,是视频还是音乐

浏览器不依靠URL来判断响应的内容。

###HTTP请求

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格式的图片

通常服务器的HTTP响应会携带内容,也就是有一个Body,包含响应的内容,网页的HTML源码就在Body中。

步骤3:如果浏览器还需要继续想服务器请求其它资源,比如图片,就在此发出HTTP请求,重复步骤1、2.

HTTP格式

每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。

GET请求格式:

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

POST请求格式

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

body data goes here...

当遇到两虚两个\r\n时,Header部分借宿,后面的数据全部是Body。

HTTP响应的格式:

200 ok
Header1: Value1
Header2: Value2

body data goes here...

当存在Content-Encoding时,Body数据是被压缩的,最常见的压缩方式是gzip;

看到Body数据先解压缩,才能得到正在的数据。压缩的目的在于减少Body的大小,加快网络传输。

URL的使用

解析URL需要用到url模块,通过parse()将一个字符串解析为一个Url对象:

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'
}

path

处理本地文件目录需要使用path模块,它可以方便地构造目录:

var path = require('path');

//解析当前目录
var workDir = path.resolve('.');

//组合完整的文件路径: 当前目录 + 'path' + 'index.html';
var filePath = path.join(workDir, 'pub', 'index.html');

使用path模块可以正确处理操作系统相关的文件路径。返回的路径类似于

/Users/path/index.html, 这样,我们就不关心怎么拼接路径了

搭建http服务器

实现一个http服务器:

浏览器端输入 地址:端口/当前目录下存在的文件,将文件内容发送给浏览器

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

//获取文件当前路径
var root = path.resolve(process.argv[2] || '.');

var httpServer = createHttpServer(function(request, response) {
  	//获取请求地址中的地址(移除主机名及后面参数)
  	var pathname = url.parse(request.url).pathname;
  	//组合路径
  	var filename = path.join(root, pathname);
    fs.stat(filename, function(err, stats) {
      if(!err && stats.isFile()) {
        response.writeHead(200);
        //读出对应目录文件并输出给浏览器
        fs.createReadStream(filename).pipe(response);
      } else {
        response.writeHead(404);
        response.end('404 Not Found');
      }
    });
});

由于response 对象本身是一个Writable Stream, 直接用pipe() 方法就是先了自动读取文件内容并输出到HTTP响应,

crypto 加密功能使用

md5 加密

var crypto = require('crypto');
var hash = crypto.createHash('md5');
hash.update('文字1');
hash.update('文字2');
//流加密操作,与hash.update(文字1文字2); 一致
hash.desget('hash');

hMac加密

var crypto = require('crypto');
var hmac = crypto.createHmac('sha256');
hmac.update('文字1');
hmac.update('文字2');
hash.desget('hash');
Top
Foot