API 网关在阿里云函数体系中比较特殊,他类似于创建一个无触发器函数,通过平台网关的绑定,从而绑定到特定的路径上。

使用方式

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

  1. service:
  2. name: midway-faas-examples
  3. provider:
  4. name: aliyun
  5. functions:
  6. apiGatewayTrigger:
  7. handler: index.handler
  8. events:
  9. - apigw: true
  10. package:
  11. artifact: code.zip

f deploy 后,参考阿里云文档配置即可。

:::info 当前 API 网关的 yml 配置写法过于复杂,暂时无法支持,请在平台进行配置。 :::

本地测试

midway faas 将 api 网关的代码结构和 http 保持了相同,业务不再需要返回特定的 JSON 结构,框架会自动转为 API 网关所需要的结构。

  1. {
  2. "isBase64Encoded":true|false,
  3. "statusCode":httpStatusCode,
  4. "headers":{response headers},
  5. "body":"..."
  6. }

测试方式如下:

  1. // test
  2. describe('/test/index.test.ts', () => {
  3. it('invoke', async () => {
  4. const result: any = await invoke({
  5. functionName: 'apiGatewayTrigger', // 函数名
  6. data: [ {
  7. path: '/api',
  8. method: 'POST', // 请求方法类型
  9. headers: {}, // 请求头
  10. query: {},
  11. pathParameters: {}, // 路径参数,比如 /api/:id
  12. body: { // 请求的 body
  13. name: 'test'
  14. },
  15. }],
  16. });
  17. // API Gateway must be get a string text
  18. assert.deepEqual(result.body, '{"message":"Hello Midway FaaS!"}');
  19. });
  20. });
  21. // index.ts
  22. @Func('api.index')
  23. async handler() {
  24. console.log(this.ctx.method); // POST
  25. console.log(this.ctx.path); // /api
  26. console.log(this.ctx.request.body['name']); // test
  27. return {
  28. message: 'Hello Midway FaaS!',
  29. }
  30. }

HTTP Context API

Midway faas 在 http 和 API 网关场景下,将代码写法进行了简化,并向传统 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 中。 :::

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