美文网首页
node系列扯犊子之三http模块

node系列扯犊子之三http模块

作者: wsgdiv | 来源:发表于2021-05-09 00:38 被阅读0次

    1、http.STATUS_CODES

    是一个对象,属性名都是状态码,属性值则是该状态码的简短解释。

    2、用法

    var http = require('http');       //引入http模块
    
    http.createServer(function(req, res) {           //调用http模块的createServer方法,创造一个服务器实例
    //createServer方法接受一个函数作为参数
    //该函数的request参数是一个对象,表示客户端的HTTP请求
    //response参数也是一个对象,表示服务器端的HTTP回应
    
      // 主页
      if (req.url == "/") {
        res.writeHead(200, { "Content-Type": "text/html" });   //response.writeHead方法用来写入HTTP回应的头信息
        res.end("Welcome to the homepage!");    response.end方法用来写入HTTP回应的具体内容并关闭本次对话
      }
    
      // About页面
      else if (req.url == "/about") {
        res.writeHead(200, { "Content-Type": "text/html" });
        res.end("Welcome to the about page!");
      }
    
      // 404错误
      else {
        res.writeHead(404, { "Content-Type": "text/plain" });
        res.end("404 error! File not found.");
      }
    
    }).listen(8080, "localhost");
    

    createServer方法的回调的request对象,拥有属性:

    url:发出请求的网址。
    method:HTTP请求的方法。
    headers:HTTP请求的所有HTTP头信息。

    request的方法
    setEncoding()方法用于设置请求的编码。
    addListener()方法用于为请求添加监听事件的回调函数

    http.request(options[, callback])

    request方法的options参数,可以是一个对象,也可以是一个字符串。如果是字符串,就表示这是一个URL,Node内部就会自动调用url.parse(),处理这个参数。

    options对象可以设置如下属性。

    host:HTTP请求所发往的域名或者IP地址,默认是localhost。
    hostname:该属性会被url.parse()解析,优先级高于host。
    port:远程服务器的端口,默认是80。
    localAddress:本地网络接口。
    socketPath:Unix网络套接字,格式为host:port或者socketPath。
    method:指定HTTP请求的方法,格式为字符串,默认为GET。
    path:指定HTTP请求的路径,默认为根路径(/)。可以在这个属性里面,指定查询字符串,比如/index.html?page=12。如果这个属性里面包含非法字符(比如空格),就会抛出一个错误。
    headers:一个对象,包含了HTTP请求的头信息。
    auth:一个代表HTTP基本认证的字符串user:password。
    agent:控制缓存行为,如果HTTP请求使用了agent,则HTTP请求默认为Connection: keep-alive,它的可能值如下:
    undefined(默认):对当前host和port,使用全局Agent。
    Agent:一个对象,会传入agent属性。
    false:不缓存连接,默认HTTP请求为Connection: close。
    keepAlive:一个布尔值,表示是否保留socket供未来其他请求使用,默认等于false。
    keepAliveMsecs:一个整数,当使用KeepAlive的时候,设置多久发送一个TCP KeepAlive包,使得连接不要被关闭。默认等于1000,只有keepAlive设为true的时候,该设置才有意义。

    临时补充:

    querystring字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析。querystring模块只提供4个方法:

    querystring.parse 将一个字符串反序列化为一个对象
    querystring.stringify 将一个对象序列化成一个字符串,与querystring.parse相对
    querystring.escape 使传入的字符串进行编码
    querystring.unescape 将含有%的字符串进行解码

    3、Server()

    声明:http.createServer与http.Server的区别:
    两者实现的效果是一样的,其中http.createServer更为便捷。

    Server方法用于新建一个服务器实例。

    var http = require('http');
    var fs = require('fs');
    
    var server = new http.Server();
    server.listen(8000);
    
    server.on('request', function (request, response) {
      // 解析请求的URL
      var url = require('url').parse(request.url);
      if (url.pathname === '/test/1') {
        response.writeHead(200, {'Content-Type': 'text/plain; charset=UTF-8'});
        response.write('Hello');
        response.end();
      } else if (url.pathname === '/test/2') {
        response.writeHead(200, {'Content-Type': 'text/plain; charset=UTF-8'});
        response.write(request.method + ' ' + request.url +
          ' HTTP/' + request.httpVersion + '\r\n');
        for (var h in request.headers) {
          response.write(h + ': ' + request.headers[h] + '\r\n');
        }
        response.write('\r\n');
        request.on('data', function(chunk) { response.write(chunk); });
        request.on('end', function(chunk) { response.end(); });
      } else {
        var filename = url.pathname.substring(1);
        var type;
        switch(filename.substring(filename.lastIndexOf('.') + 1))  {
          case 'html':
          case 'htm':      type = 'text/html; charset=UTF-8'; break;
          case 'js':       type = 'application/javascript; charset=UTF-8'; break;
          case 'css':      type = 'text/css; charset=UTF-8'; break;
          case 'txt' :     type = 'text/plain; charset=UTF-8'; break;
          case 'manifest': type = 'text/cache-manifest; charset=UTF-8'; break;
          default:         type = 'application/octet-stream'; break;
        }
        fs.readFile(filename, function (err, content) {
          if (err) {
            response.writeHead(404, {
              'Content-Type': 'text/plain; charset=UTF-8'});
            response.write(err.message);
            response.end();
          } else {
            response.writeHead(200, {'Content-Type': type});
            response.write(content);
            response.end();
          }
        });
      }
    });
    

    listen方法用于启动服务器,它可以接受多种参数

    var server = new http.Server();
    
    // 端口
    server.listen(8000);
    
    // 端口,主机
    server.listen(8000, 'localhost');
    
    // 对象
    server.listen({
      port: 8000,
      host: 'localhost',
    })
    //三种写法皆可。
    

    4、搭建HTTPs服务器

    自制SSL证书需要OpenSSL,具体命令如下。

    $ openssl genrsa -out key.pem
    $ openssl req -new -key key.pem -out csr.pem
    $ openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
    $ rm csr.pem
    

    上面的命令生成两个文件:ert.pem(证书文件)和 key.pem(私钥文件)。有了这两个文件,就可以运行HTTPs服务器了。

    var https = require('https');
    var fs = require('fs');
    
    var options = {
      key: fs.readFileSync('key.pem'),
      cert: fs.readFileSync('cert.pem')
    };
    
    var a = https.createServer(options, function (req, res) {
      res.writeHead(200);
      res.end("hello world\n");
    }).listen(8000);
    

    HTTPs服务器与HTTP服务器的最大区别,就是createServer方法多了一个options参数。

    参考链接:
    http://javascript.ruanyifeng.com/nodejs/http.html
    https://www.cnblogs.com/yizhiamumu/p/9046017.html

    相关文章

      网友评论

          本文标题:node系列扯犊子之三http模块

          本文链接:https://www.haomeiwen.com/subject/ihaudltx.html