声明式API

这是一种快速定义接口的写法,将传统的Controller变成了一个interface,同时对框架进行了各种增强,使得在没有Controller的情况下依然不会丢失Controller的作用。

声明一个接口

创建一个interface,在里面用抽象方法声明接口

public interface ExpApi {

    /**
     * get请求示例
     * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
     * @param expVO
     * @return
     */
    List<ExpVO> expGetRequest(ExpVO expVO);
}

创建一个Service实现这个接口

  • 这个Service直接调用DAO即可,刚才的interface可以看做是Controller
  • 需要加上@MarsBean注解,同时在注解里设置bean的名称,如果不设置默认为该类首字母小写
  • 这个类不一定必须实现上面的interface,只要保证里面的方法跟上面的interface里一致即可,也就是说这句不是必须的【implements ExpApi】,之所以写这句,是为了快速生成一模一样的方法
@MarsBean("expApiService")
public class ExpApiService implements ExpApi {


    @Override
    public List<ExpVO> expGetRequest(ExpVO expVO) {

        // 打印接收到的参数,看是否接收成功
        System.out.println(expVO.getName());
        System.out.println(JSON.toJSONString(expVO.getNames()));

        // 返回数据
        return getExpResultData();
    }
}

在刚才的interface上加上@MarsApi注解

  • 在@MarsApi注解里设置属性refBean,将其设置为Service的bean名称
  • 经过这个设置,这个API才知道具体要引用哪个实现
@MarsApi(refBean="expApiService")
public interface ExpApi {

    /**
     * get请求示例
     * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
     * @param expVO
     * @return
     */
    List<ExpVO> expGetRequest(ExpVO expVO);
}

@MarsReference注解

  • 上面的声明方式,虽然清晰,但是有一定的局限性。
  • 那就是,在@MarsApi注解里设置了refBean属性,这就导致这个interface里的api必须都出自refBean指向的那个bean,否则会引用不到。
  • 这样一来就会出现一些局限,所以我们还提供了另一个注解@MarsReference
  • @MarsReference注解的用法如下,【注意看注释,和双引号里的汉字哦】
/**
 * 跟上面第一步一样,正常声明一个接口
 */
@MarsApi(refBean = "这里还是可以引用bean")
public interface ExpApi {

    /**
     * get请求示例
     * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
     * @param expVO
     * @return
     */
    @MarsReference(beanName = "这里的规则,请看下面第一点",refName = "这里的规则,请看下面第二点",refType = RefType.METHOD)
    List<ExpVO> expGetRequest(ExpVO expVO);

}
  1. beanName属性: 这里也可以引用一个bean,如果这里引用了就以这个为主,如果这里没引用就以interface上的全局为主
  2. refName属性: 要引用的资源,可以是方法名也可以是属性名,如果不设置,默认为这个方法的名称
  3. refType属性: 用来标记 refName里设置的是方法名还是属性名,默认为方法名

除了上面的声明式玩法,我们还支持传统的Controller

  • 这种写法下,@MarsApi里不需要设置refBean属性
  • 将Service注入进来,然后在方法里调用即可
@MarsApi
public class DemoController {

    @MarsWrite("userInfoServiceImpl")
    private UserInfoService userInfoService;

    public String demo(UserInfoDTO userInfoDTO, HttpMarsRequest request){
        return "";
    }
}

@RequestMethod注解

API的请求方式默认是get,如果想改成post或者其他,可以在interface里面的方法上加上@RequestMethod(ReqMethod.POST) 注解

注意:目前接口只受理:GET,POST,PUT,DELETE 四种请求,其他的请求可以被服务收到,也会响应200,但是接口不受理

前端访问API接口的方式如下:

http://ip:端口号,或者域名/Api里的方法名称

打印请求响应日志

在API的方法上加上MarsLog注解 即可打印,如下图所示:

@MarsApi(refBean="expApiService")
public interface ExpApi {

    @MarsLog
    List<ExpVO> expGetRequest(ExpVO expVO);
}

注意事项

  1. 接口的参数列表支持后面括号里的任意一种或者多种并存【自定义对象,Map,HttpMarsRequest, HttpMarsResponse】
  2. 返回类型支持【任意类型】

results matching ""

    No results matching ""