Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

调用HTTP接口 #16

Open
luoway opened this issue Sep 20, 2023 · 0 comments
Open

调用HTTP接口 #16

luoway opened this issue Sep 20, 2023 · 0 comments

Comments

@luoway
Copy link
Owner

luoway commented Sep 20, 2023

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

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

http 内置模块

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

前文启动的HTTP服务

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

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

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 的设置工作:

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

参考资料

@luoway luoway changed the title 调用接口 调用HTTP接口 Sep 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant