zoukankan      html  css  js  c++  java
  • Node.js核心模块-http

    通过node中的http模块可以创建编写服务器

    引入

    const http = require('http')

    http举例使用:

    const http = require('http')    //引入
    const server = http.createServer()  //创建web服务器
    // 服务器可以提供的服务:对数据的服务
    // 1、发请求
    // 2、接收请求
    // 3、处理请求
    // 4、发送响应
    
    server.on('request', () => {
        console.log('收到客户端的请求了')
        //当客户端请求过来就会自动触发request请求事件,然后执行回调参数
    })
    //绑定端口号,启动服务器
    server.listen(3000, () => {
        console.log('服务器启动成功,可以通过访问http://127.0.0.1:3000/来进行访问')
    })

    当使用node运行上面代码时,会看到终端中打印出 服务器启动成功,可以通过访问http://127.0.0.1:3000/来进行访问 。在浏览器中打开 http://127.0.0.1:3000/ 地址,会看到终端中打印出 收到客户端的请求了 。不停的刷新页面会不停的打印出这句话。浏览器一直处在加载状态,因为我们所创建的服务器并没有返回信息,客户端一直在等待

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

    可以创建一个Web服务器,返回一个 http.Server 实例

    第二个参数requestListener是一个自动添加到 'request' 事件的函数。也就是说

    const server = http.createServer()
    server.on('request', (req, res) => {
        console.log('执行request监听事件')
    })
    server.listen(3002)

    等价于

    const server = http.createServer((req, res) => {
        console.log('执行request监听事件')
    }).listen(3002)

    http.server类

    http.server类的事件也是通过 on 绑定

    server.on('事件名称', callback)

    request事件

    每次有请求时都会触发,端口号后的字符串怎么改变都会触发这个事件

    server.on('request', () => {
        console.log('收到客户端的请求了')
        //当客户端请求过来就会自动触发request请求事件,然后执行回调参数
    })

    回调函数中有两个参数:request与response

    参数request

    请求对象,可以用来获取客户端的一些请求信息,例如请求路径。参照http.IncomingMessage 类

    参数response

    响应对象,可以用来给客户端发送响应消息,具体属性与方法同http.ServerResponse类

     

    server.listen()

    启动 HTTP 服务器监听连接。

    server.listen([port][,callback])

    • port:可选,端口号
    • callback:可选,回调函数

    http.ServerResponse 类

    作为第二个参数传给 request 事件

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

    可以给客户端发送响应数据。write可以使用多次(一般不会使用多次,都使用end直接发送数据),但最后一定要使用end来结束响应,否则客户端会一直等待

    server.on('request', (request, response) => {
        console.log(`收到客户端的请求了,请求路径是${request.url}`)
        response.write('hello')
        response.write('nodejs')
        //必须有end
        response.end()
    })

    打开浏览器,网页中显示hellonodejs

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

    • data:必须是字符串或者二进制数据

    响应完成时调用。可以省略write直接在end时发送响应数据

    server.on('request', (req, res) => {
        res.end('hello nodejs')
    })

    当data不是字符串或者二进制时会报错

    server.on('request', (req, res) => {
        const product = [
            {
                name: '苹果x',
                price: '8888'
            }, {
                name: '大菠萝',
                price: '5000'
            }, {
                name: '小辣椒',
                price: '1999'
            }
        ]
        res.end(product)
        //报错:The "chunk" argument must be one of type string or Buffer
    })

    数组或对象要使用JSON.stringify转换成字符串

    res.end(JSON.stringify(product))

    response.setHeader(name, value)

    • name:字符串
    • value:值

    设置响应头。

    当我们直接用res.end(中文字符)时,在浏览器中打开是乱码的,

    const server = http.createServer((req, res) => {
        res.end('你好')
    }).listen(3002)

    这时我们需要添加响应头设置content-type,之后浏览器就会正常显示中文字符不会乱码了。text/plain为普通文本

    const server = http.createServer((req, res) => {
        res.setHeader('Content-type', 'text/plain;charset=utf-8')
        res.end('你好')
    }).listen(3002)

    如果需要发送的是html格式的字符串,需要设置content-type为text/html,浏览器就能将返回的内容作为html内容解析

    const server = http.createServer((req, res) => {
        res.setHeader('Content-type', 'text/html;charset=utf-8')
        res.end('<a href="#">你好,请点击</a>')
    }).listen(3002)

    如果返回的是整个html文档,也可在HTML页面中通过meta元数据来声明当前文本的编码格式

    node.js

    fs.readFile('./www/apple/login.html', (err, data) => {
        res.end(data)
    })

    login.html

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8">
        <!-- 声明编码类型 -->
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <h3>登录</h3>
    </body>
    
    </html>

    具体content-type对照表请查看https://www.cnblogs.com/lianglanlan/p/12171713.html

    response.statusCode

    设置发送给客户端的状态码。例如在需要临时重定向时需要设置状态码为302

    res.statusCode = 302
    res.setHeader('Location', '/')
    res.end()

    http.IncomingMessage 类

    作为第一个参数传给server的request事件,以下使用message替代

    message.url

    请求的url字符串。端口号后面的字符串,所有的url都是以'/'开头

    server.on('request', (request) => {
        console.log(`收到客户端的请求了,请求路径是${request.url}`)
    })

    在浏览器中输入 http://127.0.0.1:3000终端会打印出 收到客户端的请求了,请求路径是/ 

    在浏览其中输入 http://127.0.0.1:3000/a终端会打印出 收到客户端的请求了,请求路径是/a  

    判断url路径处理响应

    server.on('request', (req, res) => {
        const url = req.url
        if (url === '/') {
            res.end('index page')
        } else if (url === '/login') {
            res.end('login page')
        } else {
            res.end('404 Not Found')
        }
    })

    message.socket

    同 net.socket

  • 相关阅读:
    ccBPM典型的树形表单和多表头表单的流程示例
    Arrays -数组工具类,数组转化字符串,数组排序等
    String
    ArrayList
    Random
    Scanner
    Phone-java标准类
    HelloWorld-java
    c++ 由无向图构造邻接表,实现深度优先遍历、广度优先遍历。
    c++实现哈夫曼树,哈夫曼编码,哈夫曼解码(字符串去重,并统计频率)
  • 原文地址:https://www.cnblogs.com/lianglanlan/p/12097293.html
Copyright © 2011-2022 走看看