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)
    })
})
posted @ 2020-05-18 14:45  青S衫%  阅读(532)  评论(0编辑  收藏  举报