后端的接口

后端的接口

作者:王书硕


之所以叫“后端的接口”是为了与“go的接口”区分开。

因为前端只能访问到go不能直接访问到后端,所以后端提供的接口,只能通过go访问。那么就要在go上加一个接口,前端访问go的接口,go访问后端的接口。

下面介绍一下实现一个go接口的步骤。

一、声明后端接口地址

在文件 trek/urls/url.yaml 中声明接口地址

比如这样

project:
  CloseProject: "/Project/close"

其中的 project 是模块,最后的url会是 /project/Project/close

然后进入到 go-gen/main 中,执行 sh ./gen.sh url 会自动生成 url。

二、添加go的接口

找到文件 trek/web/controllers/web-controllers/transparent/index.go

1. 在 BeforeActivation 方法中创建go的接口

1
2
3
4
5
func (c *transparentController) BeforeActivation(b mvc.BeforeActivation) {
  // ...
  b.Handle(iris.MethodPost, "/BudgetAccount/batchSetIndicators", "BudgetAccountBatchSetIndicators")
  // ...
}
其中b.Handle 方法的三个参数分别是

  • http method
  • go接口url(前端访问的url)
  • go接口的处理函数

2. 实现“处理函数”

在上面提到的BeforeActivation方法下面,创建一个与它同级的方法,也就是接口处理函数,内容就是直接给后端发起一个请求。

其中第11行是第一步中声明的后端url地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func (c *transparentController) BeforeActivation(b mvc.BeforeActivation) {
  // ...
  b.Handle(iris.MethodPost, "/BudgetAccount/batchSetIndicators", "BudgetAccountBatchSetIndicators")
  // ...
}

func (c *transparentController) BudgetAccountBatchSetIndicators() interface{} {
	return Fetch(c, context.TFetchOption{
		Method: "post",
		Url:	urls.BudgetBatchSetIndicators,
	})
}

三、前端调接口

找到文件 apps/link/src/api/urls.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  budgetControlRule: {
    batchEnable: `${ApiHost}/BudgetControlRule/batchEnable`,
    enable: `${ApiHost}/BudgetControlRule/enable`,
  },
  budgetAccount: {
    batchSetIndicators: `${ApiHost}/BudgetAccount/batchSetIndicators`
  },
  // 资产管理
  asset: {
    // 获取资产卡片建卡日期的可选范围
    getAssetBusinessDateRange: `${ApiHost}/asset/getAssetBusinessDateRange`,
    // 获取变动单或处置单业务日期的可选范围
    getBusinessDateRange: `${ApiHost}/asset/getBusinessDateRange`,

经过上面的3步麻烦的操作,终于可以调接口了

import client from '@client';
import { urls } from '@root/api';
...
client.post(urls.budgetAccount.batchSetIndicators, data);
...

透传的通用解

  1. 在各个模块下都定义一个A接口
project:
  ProjectA: "/"

contract:
  ContractA: "/"
  1. 接口处理
func (c *transparentController) BeforeActivation(b mvc.BeforeActivation) {
  b.Handle(iris.MethodPost, "/A", "A")
}
var (
	method = flag.String("method", "method", "backend interface method")
	url = flag.String("url", "url", "backend interface url")
	module = flag.String("module", "module", "backend interface module")
)
var hostMap = map[string]string{
	"project": urls.ProjectA,
  "contract": urls.ContractA,
}
func (c *transparentController) A() interface{} {
	flag.Parse()
	m := c.Ctx.Params().Get(*method)
	u := c.Ctx.Params().Get(*url)
	mod := c.Ctx.Params().Get(*module)
	
	return Fetch(c, context.TFetchOption{
		Method: m,
		Url:    path.Join(hostMap[mod], u),
	})
}
  1. 前端使用
import client from '@client';

client.post("/A", {
  method: 'post',
  url: '/project/closeStage',
  module: 'project',
});