阿里云的 HTTP 触发器和其他平台的有所区别,是独立于 API 网关的另一套服务于 HTTP 场景的触发器。相比于 API 网关,该触发器更易于使用和配置。

单接口配置

f.yml 中配置函数,同时配置触发器类型。

  1. service:
  2. name: midway-faas-examples
  3. provider:
  4. name: aliyun
  5. functions:
  6. httpGetTrigger:
  7. handler: index.get
  8. events:
  9. - http:
  10. method: get ## 配置请求方法
  11. path: /api ## 配置请求路径

对应代码如下。

  1. import { Func, Inject, Provide } from '@midwayjs/decorator';
  2. import { FaaSContext } from '@midwayjs/faas';
  3. @Provide()
  4. export class APIService {
  5. @Inject()
  6. ctx: FaaSContext; // context
  7. @Func('index.get')
  8. async get() {
  9. return this.ctx.method;
  10. }
  11. }

发布完成后,平台状态如下。

image.png
也可以配置多个 method,如果不写,默认为 all

  1. service:
  2. name: midway-faas-examples
  3. provider:
  4. name: aliyun
  5. functions:
  6. httpGetTrigger:
  7. handler: index.get
  8. events:
  9. - http:
  10. method:
  11. - get
  12. - post ## 配置多种请求方法
  13. path: /api ## 配置请求路径
  14. httpDefaultTrigger:
  15. handler: index.post
  16. events:
  17. - http:
  18. path: /* ## 不写 method ,默认为 all

多接口配置

如果需要配置多个不同接口,可以增加不同的函数,比如以下的示例表示配置了 5 个单独 method 的函数以及 1 个支持全 method 的函数:

  1. service:
  2. name: midway-faas-examples
  3. provider:
  4. name: aliyun
  5. functions:
  6. httpGetTrigger:
  7. handler: index.get
  8. events:
  9. - http:
  10. method: get
  11. path: /
  12. httpPostTrigger:
  13. handler: index.post
  14. events:
  15. - http:
  16. method: post
  17. path: /
  18. httpPutTrigger:
  19. handler: index.put
  20. events:
  21. - http:
  22. method: put
  23. path: /
  24. httpDeleteTrigger:
  25. handler: index.del
  26. events:
  27. - http:
  28. method: delete
  29. path: /
  30. httpHeadTrigger:
  31. handler: index.head
  32. events:
  33. - http:
  34. method: head
  35. path: /
  36. httpAllTrigger:
  37. handler: index.all
  38. events:
  39. - http:
  40. method: any ## 表示支持所有 method
  41. path: /api

:::info method 为空时,默认为 any,即为 ‘GET’, ‘PUT’, ‘POST’, ‘DELETE’, ‘HEAD’ 所有类型。 :::

在 midway faas 的体系中,我们可以将多个函数写到同一个类中,代码如下,每个使用 @Func 修饰的方法都可以作为一个单一函数来访问:

  1. import { Func, Inject, Provide } from '@midwayjs/decorator';
  2. import { FaaSContext } from '@midwayjs/faas';
  3. @Provide()
  4. export class APIService {
  5. @Inject()
  6. ctx: FaaSContext;
  7. @Func('index.get')
  8. async get() {
  9. return this.ctx.method;
  10. }
  11. @Func('index.post')
  12. async post() {
  13. return this.ctx.method;
  14. }
  15. @Func('index.put')
  16. async put() {
  17. return this.ctx.method;
  18. }
  19. @Func('index.del')
  20. async del() {
  21. return this.ctx.method;
  22. }
  23. @Func('index.head')
  24. async head() {
  25. return this.ctx.method;
  26. }
  27. @Func('index.all')
  28. async all() {
  29. return this.ctx.method;
  30. }
  31. }

发布效果,每个配置的函数都将发布成一个平台上的函数,并且自动配置 http 触发器:

image.png

HTTP Context API

Midway faas 在 http 场景下,将代码写法进行了简化,并向传统 koa 写法保持尽可能一致。

  1. @Provide()
  2. export class APIService {
  3. @Inject()
  4. ctx: FaaSContext;
  5. @Func('index.get')
  6. async get() {
  7. const query = this.ctx.query;
  8. const url = this.ctx.path;
  9. const method = this.ctx.method;
  10. // 等价于 this.ctx.body = 'hello world'; 两者都支持
  11. return 'hello world';
  12. }
  13. @Func('index.post')
  14. async post() {
  15. const body = this.ctx.request.body;
  16. return this.ctx.method; // POST
  17. }
  18. }

:::info 直接 return 的内容,会被自动挂载到 ctx.body 中。 :::

详细文档,请访问函数上下文

自定义域名

你需要提前申请一个域名,在国内的话,需要备案,否则无法绑定。

添加域名解析到你函数对应网关。
image.png
在函数页面绑定自定义域名,添加路由
image.png

绑定完成后,即可用域名访问。