调用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