zoukankan      html  css  js  c++  java
  • Nodejs的http模块

    一、http服务器

      我们知道传统的HTTP服务器是由Aphche、Nginx、IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器。例如,下面的代码就是使用Nodejs搭建了一个简易的服务器:

    /**
     *main.js
     *在终端输入node main.js,打开浏览器在地址栏输入localhost:3000
     *浏览器显示Hello Nodejs
     */
    
    //获取http模块
    var http = require("http");
    //获取http.Server对象
    var server = new http.Server();
    
    //创建服务器,并监听3000端口
    server.on("request",function(req,res) {
        res.writeHead(200,{
            "content-type":"text/plain"
        });
        res.write("Hello Nodejs");
        res.end();
    }).listen(3000);

      http模块中封装了一个HTTP服务器和一个简易的HTTP客户端:使用http.Server类创建一个基于事件的HTTP服务器,而使用http.request()和http.get()方法则可以作为HTTP客户端向服务器发起请求。

      上面的示例代码创建了一个http.Server对象,然后为其添加request事件监听,这个事件会在每次接收到请求时触发。text/plain的意思是将文件设置为纯文本格式,浏览器在获取到这种文件时并不会对其进行处理,如果将content-type设置为text/html,浏览器在获取到这种文件时会自动调用HTML的解析器对文件进行相应的处理。另外,也可以使用createServer()方法简化这一过程:

    var http = require("http");
    
    //createServer()方法创建的http.Server对象默认添加了一个request事件监听
    http.createServer(function(req,res) {
        res.writeHead(200,{
            "content-type":"text/plain"
        });
        res.write("Hello Nodejs");
        res.end();
    }).listen(3000);


      上面说到了http.Server类的事件,http.Server类最常用的事件是"request"事件。在"request"事件中,传入回调函数的参数req和res分别是http.IncomingMessage类(它实现了可读流的接口)和http.ServerResponse类(它实现了可写流的接口)的实例。

      1、IncomingMessage对象包含了从客户端发来的http请求信息,它可以用来访问响应状态、消息头、以及数据等,例如:

    var http = require("http");
    
    http.createServer(function(req,res) {
        console.log(req.httpVersion);//http协议版本,可能的值有"1.1"或"1.0"
        console.log(req.method);//请求的方法,例如"GET"、"POST"等
        console.log(req.statusCode);//http响应状态码
        console.log(req.statusMessage);//http响应状态消息
        console.log(req.headers);//请求头或响应头的对象
        console.log(req.url);//发送http请求的客户端的url
    }).listen(3000);

      

      IncomingMessage对象包含的事件、方法以及属性参考手册:http://nodejs.cn/api/http.html#http_class_http_incomingmessage

      2、http.ServerResponse类是返回给客户端的信息,它有三个重要的方法,用于返回响应头、响应内容以及结束请求:
      writeHead(statusCode[, statusMessage][, headers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,如果不调用,则会自动生成一个响应头。statusCode是一个三位数的http状态码,如“200”表示请求成功、“404”表示请求的资源不存在;statusMessage是一个字符串,用来描述状态;headers是一个对象,即响应头。
      write(chunk[, encoding][, callback]):向请求的客户端发送响应体,在end()方法被调用前可以多次调用。chunk是一个buffer或者字符串,如果chunk是字符串,则在第二个参数需要指定编码方式,默认为utf-8。
      end([chunk][, encoding][, callback]):该方法会通知服务器,所有响应头和响应主体都已被发送,每次响应都必须调用end()方法来结束。
      ServerResponse对象包含的事件、方法以及属性参考手册:http://nodejs.cn/api/http.html#http_class_http_serverresponse

    http.Server类的事件参考手册:http://nodejs.cn/api/http.html#http_class_http_server

    二、http客户端

      http模块提供了http.request()和http.get()两个方法,功能是作为客户端向http服务器发起请求。

      1、关于http.request(options[, callback])
      options是一个对象,包含了请求的相关参数:http://nodejs.cn/api/http.html#http_http_request_options_callback

      可选参数callback会作为单次监听器被添加到”response“事件,即当请求的响应被接收到时就会调用该回调函数。它在被执行时带有一个参数res,该参数是一个 http.IncomingMessage类的实例
      返回值是一个http.ClientRequest 类的实例,它表示着一个正在处理的请求

    例如:

    /**
     *c.js
     *HTTP客户端,发送HTTP请求
     *控制台输出返回的响应内容
     */
    var http = require("http");
    var options = {
        host: "localhost",
        port: 3000
    }
    
    var req = http.request(options,function(res) {
        res.on("data",function(chunk) {
            console.log(chunk.toString("utf-8"));
        });
        res.on("end",function() {
            console.log("----请求结束!----");
        });
    });
    
    req.on("error",function(err) {
        console.log(err.message);
    });
    
    req.end();
    /**
     *s.js
     *HTTP服务器
     */
    var http = require("http");
    
    http.createServer(function(req,res) {
        res.writeHead(200,{
            "content-type":"text/plain"
        });
        res.write("Hello Nodejs");
        res.end();
    }).listen(3000);

      如果请求过程中遇到任何错误,则在返回的请求对象中会触发"error"事件;
      使用http.request()必须总是调用req.end()来表明请求的结束,即使没有数据被写入请求体;

      2、关于http.get(options[,callback])方法
      http.get()方法是http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end()。

    三、总结

      Nodejs的http模块常用的类和方法:

      1、http.Server 类:用于创建HTTP服务器,使用时需要先实例化;

      2、http.ClientRequest 类:该对象在 http.request() 内部被创建并返回。它表示着一个正在处理的请求;

      3、http.IncomingMessage 类:IncomingMessage对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别传递给 'request' 和 'response' 事件。 它可以用来访问响应状态、消息头、以及数据。它实现了可读流接口;

      4、http.ServerResponse 类:ServerResponse对象由http.Server创建,并作为第二个参数传递给 'request' 事件。它实现了可写流接口;

      5、http.createServer( [callback] )方法:返回一个http.Server对象,callback会被自动添加到 'request' 事件中;

      6、http.request( options[, callback] )方法:作为http客户端,向服务器发送请求,可选参数callback会被自动添加到 'response'事件中;

      7、http.get( options[, callback] )方法:http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end();

  • 相关阅读:
    《JavaScript高级程序设计》笔记:客户端检测(九)
    《JavaScript高级程序设计》笔记:BOM(八)
    《JavaScript高级程序设计》笔记:函数表达式(七)
    《JavaScript高级程序设计》笔记:面向对象的程序设计(六)
    小tips:JS的Truthy和Falsy(真值与假值)
    footer固定在页面底部的实现方法总结
    WEB前端需要了解的XML相关基础知识
    vuex最简单、最直白、最全的入门文档
    原生JS替代jQuery的各种方法汇总
    数据挖掘优秀工具对比
  • 原文地址:https://www.cnblogs.com/blog-cxj2017522/p/7044538.html
Copyright © 2011-2022 走看看