Node.js常用模块之HTTP

HTTP模块

用于:搭建 HTTP 服务端和客户端
步骤:
1、 调用 http 模块

    var http = require('http');

2、 创建 http server

     http.createServer([requestListener]);

requestListener 是一个请求函数,自动添加到 ‘request’ 事件。也就是我们以前所写的:

    function(request, response){
        //函数内容
    }

函数传递有两个参数:request 请求对象 和 response 响应对象。
调用 request 请求对象的属性和方法就可以拿到所有 HTTP 请求的信息,
操作 response 响应对象的方法,就可以把 HTTP 响应返回给浏览器。

3、启动 web 服务

   	node server.js
response 对象常用的方法有:
1、 response.writeHead(statusCode[, statusMessage][, headers])

表示向请求发送响应头。

参数说明:

  • statusCode:状态码,是一个 3 位 HTTP 状态码,如 404 表示网页未找到,200 表示正常。

  • statusMessage: 可选,可以将用户可读的 statusMessage 作为第二个参数。

  • headers:响应头。
    也就是设置 Content-Type 的值,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
    常用值有:
    (1)text/html:HTML 格式
    (2)text/plain:纯文本格式
    (3)application/x-www-form-urlencoded:数据被编码为名称/值对,这是标准的编码格式。

比如:

	response.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8' });

注:此方法只能在消息上调用一次,并且必须在调用 response.end() 之前调用它。

2、response.write()

发送一块响应主体,也就是说用来给客户端发送响应数据。可以直接写文本信息,也可以写我们的 html 代码,注意要设置 Content-Type 的值 。write 可以使用多次,但是最后一定要使用 end 来结束响应,否则客户端会一直等待。

3、response.end()

此方法向服务器发出信号,表示已发送所有响应头和主体,该服务器应该视为此消息完成。必须在每个响应上调用方法 response.end()。

例子:

      // 加载 http 模块
            var http = require('http');
            // 创建服务器
            http.createServer(function (request, response) {
            
                // 发送 HTTP 头部
                // HTTP 状态值: 200 : OK
                // 内容类型: text/html
                response.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
        
            // 发送响应数据 'hello'
            response.write('hello');
            // 发送数据 hello world 并且字体为 h1 格式
            response.write('<h1>hello world</h1>');
            // 结束
        response.end();
    
        // 上面的三行代码也可以直接写成 response.end('hello syl <h1>hello world</h1>');
    }).listen(8080);
    
    // 终端打印如下信息
    console.log('Server running at http://127.0.0.1:8080/');
request 对象:
1、request.url

获取请求路径,获取到的是端口号之后的那一部分路径,也就是说所有的 url 都是以 / 开头的,判断路径处理响应。

2、request.socket.localAddress

获取 ip 地址。

3、request.socket.remotePort

获取源端口。

比如:

    var http = require('http')
    
    // 1. 创建 Server
    var server = http.createServer()
    
    // 2. 监听 request 请求事件,设置请求处理函数
    server.on('request', function (req, res) {
      console.log('收到请求了,请求路径是:' + req.url)
      console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort)
      var url = req.url
      res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
      if (url === '/') {
        res.end('<h1>Index page</h1>')
      } else if (url === '/login') {
        res.end('<h1>Login page</h1>')
      } else {
        res.end('404 Not Found.')
      }
    })
    
    // 3. 绑定端口号,启动服务
    server.listen(8080, function () {
      console.log('服务器启动成功,可以访问了。。。')
    })
   
应用: 创建一个简单的网站

新建两个 html 文件,分别叫 index.html 和 register.html 。
新建一个 server.js 写我们的服务器代码。

	//  结合 fs 发送文件中的数据
	//  引入 http 和 fs 模块
	var http = require('http');
	var fs = require('fs');
	// 创建服务器
	var server = http.createServer();
	// 监听 request 请求事件,设置请求处理函数
	server.on('request', function(req, res) {
	    // 处理 url
	    var url = req.url;
	    if(url === '/') {
	        // 下面注释代码的写法显然是不合理的
	        // res.end('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><h1>首页</h1></body>/html>')
	        res.setHeader('Content-Type', 'text/plain');
	        // 我们要发送的还是在文件中的内容
	        fs.readFile('./index.html', function(err, data) {
	            if(err) {
	                res.end('文件读取失败,请稍后重试!');
	            } else {
	                // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
	                // res.end() 支持两种数据类型,一种是二进制,一种是字符串
	                res.writeHead(200, {
	                    'Content-Type': 'text/html'
	                });
	                res.end(data);
	            }
	        })
	    } else if(url === '/register') {
	        // url:统一资源定位符
	        // 一个 url 最终其实是要对应到一个资源的
	        fs.readFile('./register.html', function(err, data) {
	            if(err) {	
	                res.end('文件读取失败,请稍后重试!');
	            } else {
	                //setHeader也是设置响应头,它们将与传递给 response.writeHead() 的任何响应头合并,其中 response.writeHead() 的响应头优先。
	
	                res.setHeader('Content-Type', 'text/html');
	                res.end(data);
	            }
	        })
	    } else {
	        res.end('<h1>404 Not Found.</h1>');
	    }
	});
	
	server.listen(8080, function() {
	    console.log('Server is running...');
	});

我们可以通过更改请求路径来响应出不同的 html 页面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值