声明式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);
}
- beanName属性: 这里也可以引用一个bean,如果这里引用了就以这个为主,如果这里没引用就以interface上的全局为主
- refName属性: 要引用的资源,可以是方法名也可以是属性名,如果不设置,默认为这个方法的名称
- 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);
}
注意事项
- 接口的参数列表支持后面括号里的任意一种或者多种并存【自定义对象,Map,HttpMarsRequest, HttpMarsResponse】
- 返回类型支持【任意类型】