zoukankan      html  css  js  c++  java
  • nodejs 发起请求

    一、request 发起请求

    文档参考地址

    1. 示例

    普通 get 请求

    const http = require('http')
    
    let req =  http.request('https://www.baidu.com', res => {
        let data = ''
        // data 事件可能触发多次
        res.on('data', chunk => {
            data += chunk
        })
        res.on('end', () => {
            console.log('请求的数据 :>> ', data)
        })
    })
    // http.request 必须手动调用 req.end 来表示请求结束,才能收到返回的数据
    // 否则程序一直处于等待、挂起状态
    req.end()
    

    post 请求

    const http = require('http')
    const querystring = require('querystring')
    
    // 序列化数据
    const postData = querystring.stringify({
        'key': 'value'
    })
    
    // 请求参数
    const options = {
        hostname: 'www.baidu.com',
        port: 80,
        path: '/upload', // 此处需以 / 开头
        method: 'POST',
        headers: {
            'Content-type': 'application/x-www-form-urlencoded',
            'Content-Length': Buffer.byteLength(postData)
        }
    }
    let req =  http.request(options, res => {
        let data = ''
        console.log('状态码:', `${res.statusCode}`)
        console.log('响应头:', `${JSON.stringify(res.headers, null, 4)}`)
        res.on('data', chunk => {
            data += chunk
        })
        res.on('end', () => {
            console.log('请求的数据 :>> ', data)
        })
    })
    req.on('error', e => {
        console.log('请求发生错误:', e)
    })
    // 将数据写入主体,即 body 里面
    req.write(postData)
    req.end()
    

    2. 语法说明

    /*
     * 发起请求
     * @param url {string | URL |} 请求的 url 地址
     * @param options {Object | integer}
     *          agent {http.Agent | boolean}, 控制 Agent 的行为。可能的值有:
     *              undefined(默认): 对此主机和端口使用 http.globalAgent
     *              Agent 对象: 显示的使用传入的 Agent
     *              false: 使用新建的具有默认值的 Agent
     *          auth {string} 基本的身份验证, 即 'user:password',用户计算授权请求头
     *          createConnection {Function} 当 agent 选项为被使用时,用来为请求生成套接字或流。
     *          defaultPort {number} 协议的默认端口。若使用 Agent,则默认值为 agent.defaultPort, 否则为 undefined
     *          family {number} 当解析 host 或者 hostname时使用的 IP 地址族。有效值为 4 或 6。如果没有指定,则同时使用 IP v4 和 v6
     *          headers {Object} 包含请求头的对象
     *          host {string} 请求的服务器域名或者 IP 地址,默认值为 'localhost'
     *          hostname {string} host 的别名。如果同时指定 host 和 hostname,则使用 hostname
     *          insecureHTTPParser {boolean} 使用不安全的 HTTP 解析器,为 true 时,可以接受无效的 HTTP 请求头,默认值为 false
     *          localAddress {string} 为网络连接绑定的本地接口
     *          lookup {Function} 自定义的查看函数。默认值为 dns.lookup()
     *          maxHeaderSize {number} 可选的,重写此服务器接收的请求的 --max-http-header-size 值,即请求头的最大长度(以字节为单位)。
     *              默认值: 16384(16KB)
     *          method {string} 指定 HTTP 请求的方法,默认值:'GET'
     *          path {string} 请求的路径。应包括查询字符串(如果有的话)。例如:'/index.html?page=12'。 默认值为 '/'
     *          port {number} 远程服务器的端口。默认值:defaultPort(如果有设置的话) 或者 80
     *          protocol {string} 使用的协议。 默认值: 'http:'
     *          setHost {boolean} 指定是否自动添加 Host 请求头。 默认值 true
     *          socketPath {sring} Unix 域套接字。如果指定了 host 或 port 之一(他们指定了 TCP 套接字),则不能使用该项
     *          timeout {number} 指定套接字超时的数值,以毫秒为单位。在套接字被连接之前设置超时
     * @param callback {Function} 回调函数
     *          res {IncomingMessage} 请求返回的对象,包含返回的数据、状态码、地址、方法等
     */
    http.request(url[, options][, callback])
    http.request(options[, callback])
    

    备注:

    1. 同时指定 urloptions ,两者会进行合并,以 options 属性优先

    2. callback 会作为单次监听器(即只执行一次)被添加到 'response' 事件

    3. 使用 http.request 时,必须始终调用 req.end() 来表示请求的结束。

    4. 发送 'Connection: keep-alive' 会通知 Node.js 与服务器的连接应该持续到下一个请求

    5. 发送 'Content-Length' 请求头会禁用默认的分开编码

    6. 发送授权请求头会使用 auth 选项覆盖以计算基本的身份验证


    二、get 发起请求

    文档参考地址

    功能和参数与 http.request 类似,只是请求方法始终设置为 GET

    1. 示例

    const http = require('http')
    // 不需要手动调用 req.end()
    let req = http.get('http://www.baidu.com', res => {
        let data = ''
        res.on('data', chunk => {
            data += chunk
        })
        res.on('end', () => {
            console.log('请求的数据 :>> ', data)
        })
    })
    req.on('error', e => {
        console.log('请求发生错误 :>> ', e)
    })
    

    2. 语法说明

    /*
     * 发起 GET 请求
     *
     * @param url {string | URL} 请求地址
     * @param options {Object}  接受与 http.request 相同的 options,且 method 始终设置为 GET。从原型继承的属性将被忽略
     * @param callback {Function} 
     *      res {IncomingMessage} 请求返回的对象,包含返回的数据、状态码、地址、方法等
     */
    http.get(url[, options][, callback])
    http.get(options[, callback])
    

    备注:

    1. http.gethttp.request 的唯一区别在于 http.get 将请求方法设置为 GET 并自动调用 req.end()

    2. 如果传递了 callback 参数,添加了 response 处理函数(没有添加处理函数,响应将被完全废弃),
      需要消费完响应对象中的数据才能释放这段数据所占内存,并且触发 end 事件;添加 'data' 事件处理函数,或者调用 res.resume() 方法等即可消费数据

    const http = require('http')
    
    let req= http.get('http://www.baidu.com', res => {
        const { statusCode } = res
        
        let error
    
        if (statusCode !== '0') {
            console.log('请求失败,状态码为:', statusCode)
            res.resume()
            return
        }
    
        let data = ''
        res.on('data', chunk => {
            data += chunk
        })
        res.on('end', () => {
            console.log('请求的数据 :>> ', data)
        })
    })
    
  • 相关阅读:
    python实现的列表操作
    python的静态方法
    python标准库学习2
    javascript继承原型继承的例子
    jQuery高亮显示文本中重要的关键字
    表格展开伸缩
    jQuery设计思想
    python标准库学习3
    python中的继承和抽象类的实现
    表格的变色问题
  • 原文地址:https://www.cnblogs.com/linjunfu/p/12910497.html
Copyright © 2011-2022 走看看