跳转至

Service

说明

  • service提供Get;GetList;Add;Update;Delete等方法
  • 考虑接口暴露的安全性问题,上面的方法默认是不开放的(方法名小写)
  • 要开放上述方法,需要修改文件尾部goExportsSettings标记对中的代码,将false改为true:
    //goExportsSettingsBegin
    //true;Get;GetList;Add;Update;Delete;注意:修改true/false后要重新生成一次;
    //goExportsSettingsEnd
    
  • 修改为true后,5个方法都会开放,不想开放的方法在此行删除即可,比如不想开放add、update、delete,则修改为:
    //goExportsSettingsBegin
    //true;Get;GetList;注意:修改true/false后要重新生成一次;
    //goExportsSettingsEnd
    
  • 注意,开放的方法,前后都要有;
  • 每个方法都提供自定义代码标记对,供简单修改,如果修改太复杂,建议在customContentBegin标记对中添加新方法,方法定义与自动生成的方法类似(大写、需要一个args参数)

如何调用

  • api路径示例:http://host:port/xxxxService.xxx?m=xxx&par1=xxx&par2=xxx
    xxxxService.xxx部分:服务名.服务后缀(服务名对应于服务类ConsumeRecordService,首字母小写)
    m=xxx:要调用的方法名称(服务类中的方法,必须是公开的方法,即首字母大写的方法)
    par1=xxx&par2=xxx:传递的参数(需要什么参数,由方法内部代码逻辑确定)
  • 参数可以用get方式传递也可以用post方式传递,简单参数可用get传递,复杂参数建议用post,避免编码错乱问题
    (post方式的调用可以参考 快速开始
  • 返回的数据是一个json字符串, 是一个JSONServiceResult结构体:
    state:接口调用状态,整数,返回0表示调用成功
    message:字符串,state!=0时的错误消息
    data:interface{},接口的返回值(服务方法的实际返回值)
    DataJSON:字符串,备用字段
    ExtandData:interface{},备用字段

分页返回值

  • getList方法返回的是*paging.PagingData
    • pageIndex:页码,从1开始
    • rowsInPage:每页多少条数据
    • pagecount:总页数
    • total:总行数
    • rows:结果数组
    • userData:备用字段

add等方法中的事务处理

  • 自动生成的add方法代码如下:
    //Add ..
    func (s ConsumeRecordService) Add(args *route.ServiceArgs) string {
        item := s.getItem(args, true)
        mp := mapper.GetConsumeRecordMapper("")
        useTx := false
    
        //customBeforeAddContentBegin
        item.CreateTime = time.Now()
        //customBeforeAddContentEnd
    
        if !useTx {
            _, count := mp.Insert(nil, item)
            //item.ID = lastIntID
            if count == 0 {
                panic("Insert未成功")
            }
        }
    
        //customAfterAddContentBegin
        //customAfterAddContentEnd
    
        return item.ID
    }
    
  • 默认情况下,add方法是不使用事务的。
    如果需要使用事务,在customBeforeAddContent标记对中useTx赋值为false,然后在customAfterAddContent标记对中写入自己的代码。(当然,如果闲麻烦、包含无效代码等,可以直接添加一个函数写到customContent标记对中)

服务导出

  • 自动生成的service代码包含init函数如下:
    func init() {
        route.Add(&ConsumeRecordService{})
    }
    
  • 通过route.Services可以获取到所有注册的服务:
    func appinit() {
        //...
        exportServices(route.Services, srv)
        //...
    }
    
    func exportServices(ss []route.IService, srv route.Server) {
        for _, s := range ss {
            srv.RegisterService(s)
        }
    }
    
  • 在exportServices中可以增加导出逻辑,比如根据配置文件判断是否需要注册
  • 自己添加的服务类,可以根据项目情况灵活应用确定是否添加init函数

高级

service的高级使用可参考 api开发