声明式API

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

声明一个接口

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

  1. public interface ExpApi {
  2. /**
  3. * get请求示例
  4. * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
  5. * @param expVO
  6. * @return
  7. */
  8. List<ExpVO> expGetRequest(ExpVO expVO);
  9. }

创建一个Service实现这个接口

  • 这个Service直接调用DAO即可,刚才的interface可以看做是Controller
  • 需要加上@MarsBean注解,同时在注解里设置bean的名称,如果不设置默认为该类首字母小写
  • 这个类不一定必须实现上面的interface,只要保证里面的方法跟上面的interface里一致即可,也就是说这句不是必须的【implements ExpApi】,之所以写这句,是为了快速生成一模一样的方法
  1. @MarsBean("expApiService")
  2. public class ExpApiService implements ExpApi {
  3. @Override
  4. public List<ExpVO> expGetRequest(ExpVO expVO) {
  5. // 打印接收到的参数,看是否接收成功
  6. System.out.println(expVO.getName());
  7. System.out.println(JSON.toJSONString(expVO.getNames()));
  8. // 返回数据
  9. return getExpResultData();
  10. }
  11. }

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

  • 在@MarsApi注解里设置属性refBean,将其设置为Service的bean名称
  • 经过这个设置,这个API才知道具体要引用哪个实现
  1. @MarsApi(refBean="expApiService")
  2. public interface ExpApi {
  3. /**
  4. * get请求示例
  5. * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
  6. * @param expVO
  7. * @return
  8. */
  9. List<ExpVO> expGetRequest(ExpVO expVO);
  10. }

@MarsReference注解

  • 上面的声明方式,虽然清晰,但是有一定的局限性。
  • 那就是,在@MarsApi注解里设置了refBean属性,这就导致这个interface里的api必须都出自refBean指向的那个bean,否则会引用不到。
  • 这样一来就会出现一些局限,所以我们还提供了另一个注解@MarsReference
  • @MarsReference注解的用法如下,【注意看注释,和双引号里的汉字哦】
  1. /**
  2. * 跟上面第一步一样,正常声明一个接口
  3. */
  4. @MarsApi(refBean = "这里还是可以引用bean")
  5. public interface ExpApi {
  6. /**
  7. * get请求示例
  8. * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
  9. * @param expVO
  10. * @return
  11. */
  12. @MarsReference(beanName = "这里的规则,请看下面第一点",refName = "这里的规则,请看下面第二点",refType = RefType.METHOD)
  13. List<ExpVO> expGetRequest(ExpVO expVO);
  14. }
  1. beanName属性: 这里也可以引用一个bean,如果这里引用了就以这个为主,如果这里没引用就以interface上的全局为主
  2. refName属性: 要引用的资源,可以是方法名也可以是属性名,如果不设置,默认为这个方法的名称
  3. refType属性: 用来标记 refName里设置的是方法名还是属性名,默认为方法名

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

  • 这种写法下,@MarsApi里不需要设置refBean属性
  • 将Service注入进来,然后在方法里调用即可
  1. @MarsApi
  2. public class DemoController {
  3. @MarsWrite("userInfoServiceImpl")
  4. private UserInfoService userInfoService;
  5. public String demo(UserInfoDTO userInfoDTO, HttpMarsRequest request){
  6. return "";
  7. }
  8. }

@RequestMethod注解

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

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

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

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

打印请求响应日志

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

  1. @MarsApi(refBean="expApiService")
  2. public interface ExpApi {
  3. @MarsLog
  4. List<ExpVO> expGetRequest(ExpVO expVO);
  5. }

注意事项

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