美文网首页
Node.js(七)HTTP模块http

Node.js(七)HTTP模块http

作者: 偶余杭 | 来源:发表于2019-03-03 17:59 被阅读0次

    http是Node.js的核心模块之一,要使用http模块,需要:

    const http = require('http')
    

    创建一个服务器


    使用到的api:

    http.createServer([options][, requestListener])

    此方法返回一个新建的http.Server实例。

    http.Server类,继承自net.Server,net模块也是核心内置模块之一,用于创建基于流的 TCP 或 IPC 的服务器(net.createServer())与客户端(net.createConnection())。net.Server类用于创建 TCP 或 IPC server

    Server类的部分api:

    • server.listen():启动 HTTP 服务器监听连接。 此方法与 net.Server 中的 server.listen() 相同。
    • server.close([callback]):停止服务器接受新连接
    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    http.createServer((req,res)=>{
        const {url,method} = req;
        console.log('来了一个请求');
        if(url === '/' && method === 'GET'){
            //读取首页
            fs.readFile(path.resolve('./index.html'),(err,data)=>{
                if(err){
                    res.statusCode = 500;//服务器内部错误
                    res.end('500 - Internal Sever Error')
                    return;
                }
                res.statusCode = 200;//请求成功
                res.setHeader('Content-Type','text/html')
                //end方法可以使用buffer,加不加toString都可以
                res.end(data)
            })
        }
    }).listen(3000);
    

    以上的createServer方法传入一个函数作为参数,此函数有两个参数,第一个参数是一个对象,表示客户端的HTTP请求,第二个参数也是一个对象,表示服务端的HTTP回应。服务端的HTTP回应调用writeHead方法写入HTTP回应的头信息,使用end方法写入HTTP回应的具体内容,并关闭对话。listen方法传入数字作为端口,表示启动服务器实例,监听本机特定端口。

    http.ClientRequest 类


    这个类产生的实例表示正在进行的请求,由http.request()内部创建并返回,createServer方法的回调函数中第一个参数也是此类的实例。

    修改请求头
    • request.setHeader(name, value):为请求头对象设置单个请求头的值。
    request.setHeader('Content-Type', 'application/json');
    
    • request.getHeader(name):获取请求头,名称不区分大小写
    request.setHeader('content-type', 'text/html');
    request.setHeader('Content-Length', Buffer.byteLength(body));
    request.setHeader('Cookie', ['type=ninja', 'language=javascript']);
    const contentType = request.getHeader('Content-Type');
    // contentType 是 'text/html'。
    const contentLength = request.getHeader('Content-Length');
    // contentLength 的类型为数值。
    const cookie = request.getHeader('Cookie');
    // cookie 的类型为字符串数组。
    
    完成发送请求

    request.end([data[, encoding]][, callback])

    中止请求

    request.abort()
    将请求标记为中止。 调用此方法将导致响应中剩余的数据被丢弃并且套接字被销毁

    发送数据到服务器

    request.write(chunk[, encoding][, callback])

    • chunk <string> | <Buffer>
    • encoding <string>
    • callback <Function>
    • 返回: <boolean>
      发送一个请求主体的数据块。 通过多次调用此方法,可以将请求主体发送到服务器,在这种情况下,建议在创建请求时使用 ['Transfer-Encoding', 'chunked'] 请求头行。
      encoding 参数是可选的,仅当 chunk 是字符串时才适用。 默认为 'utf8'。
      callback 参数是可选的,当刷新此数据块时调用,但仅当数据块非空时才会调用。

    http.ServerResponse 类


    此类的实例由HTTP服务器在内部创建,不用用户创建,它作为createServer第二个参数传给request事件。
    此实例可调用的常用api:

    • response.end([data][, encoding][, callback]):向服务器发出信号,表明已发送所有响应头和主题,必须在每个响应上调用此方法,如果指定了 data,则相当于调用 response.write(data, encoding) 之后再调用 response.end(callback)
    • response.getHeader(name):读出已排队但未发送到客户端的响应头。 请注意,该名称不区分大小写。
    • response.setHeader(name, value):为隐式响应头设置单个响应头的值。
    // 返回 content-type = text/plain
    const server = http.createServer((req, res) => {
      res.setHeader('Content-Type', 'text/html');
      res.setHeader('X-Foo', 'bar');
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('ok');
    });
    
    • response.write(chunk[, encoding][, callback]):发送一块响应主体。
    • response.writeHead(statusCode[, statusMessage][, headers]):向请求发送响应头

    http.IncomingMessage 类


    IncomingMessage 对象由 http.Serverhttp.ClientRequest 创建,并分别作为第一个参数传给 'request''response' 事件。 它可用于访问响应状态、消息头、以及数据。

    相关文章

      网友评论

          本文标题:Node.js(七)HTTP模块http

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