https://eggjs.org/zh-cn/core/httpclient.html#mobileAside
将不同业务功能的模块进行拆分成独立的服务
egg的 urllib内置了 httpClient
image.png

ctx.curl请求其他API

app.curl(url, opts) 等价于 app.httpClient.request(url, opts)
ctx.curl 默认返回的是 Buffer

ctx.curl options

https://eggjs.org/api/Application.html#curl
image.png

  1. class UserService extends Service {
  2. async index(url, options) {
  3. const { ctx } = this;
  4. if (!url) {
  5. ctx.throw(400, '缺少请求 URI路径', { code: 400201 });
  6. }
  7. const {
  8. host = '', // 请求地址域名
  9. // ...rest,
  10. method = 'GET',
  11. data = {},
  12. dataType = 'json',
  13. headers = {},
  14. timeout = 10 * 1000,
  15. nestedQuerystring = false,
  16. } = options
  17. const res = await ctx.curl(url, options)
  18. if (res.status !== 200 || (res.data?.code !== 0)) {
  19. ctx.throw(res.status, res.data.msg, { ...res.data });
  20. }
  21. return res.data
  22. }
  23. }

ctx.curl get & post

  1. class CurlController extends Controller {
  2. async get() {
  3. const { ctx, app } = this;
  4. const res = await ctx.curl('http://www.lulongwen.com', {
  5. dataType: 'json', // text, 默认 dataType是 buffer
  6. timeout: 3000, // 3 秒超时
  7. })
  8. }
  9. async post() {
  10. const { ctx, app } = this;
  11. const res = await ctx.curl('http://www.lulongwen.com/login', {
  12. method: 'POST',
  13. contentType: 'json',
  14. data: ctx.request.body,
  15. dataType: 'json',
  16. })
  17. }
  18. }

router.js里面设置路由

  1. router.get('cur/get', controller.curl.get)
  2. router.post('cur/post', controller.curl.post)

dataType 返回值类型

ctx.curl默认返回的是 Buffer,需要设置 dataType来解析成不同的类型
image.png
dataType进行 data解析
image.png

app.curl

src/app.js

  1. module.exports = app => {
  2. app.beforeStart(async () => {
  3. // 示例:启动的时候去读取 https://registry.npm.taobao.org/egg/latest 的版本信息
  4. const result = await app.curl('https://registry.npm.taobao.org/egg/latest', {
  5. dataType: 'json',
  6. });
  7. app.logger.info('Egg latest version: %s', result.data.version);
  8. });
  9. };