Skip to content
导航

调用HTTP接口

在具有一定规模以上的服务端应用中,应用所需的数据、处理逻辑等,往往是分散在不同的服务器上的,这些服务器通信来交换数据,最终以一个个的HTTP或其他协议接口的形式与网页通信。

服务端应用之间的通信,一种JavaScript开发者熟悉的方式是HTTP接口通信,在SSR等前后端同构的场景下很实用。

http 内置模块

Node.js 内置模块 http 除了用于快速搭建HTTP服务,还可以作为HTTP客户端,与其他HTTP服务进行通信。

前文启动的HTTP服务

js
require('http').createServer((req, res)=>{
  res.end('OK')
}).listen(9000, ()=>console.log('http server listen on port 9000'))

发起对上述HTTP服务的HTTP GET请求

js
const http = require('http')

http.get('http://localhost:9000/', res=>{
  const { statusCode } = res
  if( statusCode !== 200){
    console.log('error', statusCode)
    res.resume() // 释放内存
    return
  }

  let rawData = ''
  res.on('data', chunk=>rawData += chunk) // 流式传输
  res.on('end', ()=>{
    console.log(rawData)
  })
}).on('error', console.error)

http 模块上另一个发起请求的方法是 request() ,可以设置请求的 method

几种常用的方法在 https 内置模块上也有着相似的用法。

fetch

Node.js v18 起支持兼容浏览器实现的全局 fetch() 方法,在之前的版本需要通过实验性选项启用,或使用第三方模块 node-fetch 替代实现。

axios

除了用于兼容浏览器标准fetch实现的 node-fetch 模块外,axios 是最受欢迎的第三方网络请求库。

axios 是同构的,在浏览器、Node.js 里大部分API是相同的。

通过选项对象配置,即可完成 HTTP Headers 的设置工作:

js
require('axios')({
  url: 'http://localhost:9000/',
  method: 'get',
  params: {}, 
  withCredentials: false,
 // ...
}).then(res=>{
  console.log(res.data)
}).catch(err=>{
   // 状态码不为2XX
  console.error(err)
})

除了 HTTP 请求的全部功能外,axios 还从程序设计上添加了灵活的扩展能力,包括:

  • 创建实例,以实例的方式复用请求配置
  • 超时处理
  • 拦截器,在
  • 取消请求,兼容 fetch AbortController

参考资料