声明式API
这是一种快速定义接口的写法,将传统的Controller变成了一个interface,同时对框架进行了各种增强,使得在没有Controller的情况下依然不会丢失Controller的作用。
声明一个接口
创建一个interface,在里面用抽象方法声明接口
public interface TestApi {
/**
* get请求示例
* http://127.0.0.1:8080/selectList?name=张三&names=王五&names=赵六
* @param expVO
* @return
*/
List<ExpVO> selectList(ExpVO expVO);
}
演示效果如下
假设现在有一个 Service,bean 名称为 aService,现在需要通过 MarsApi 来调用 aService 里面的 selectList 方法
@MarsApi(refBean="aService")
public interface TestApi {
返回类型 selectList(ExpVO expVO);
}
当我们请求这个接口的时候,他会自动调用 aService 里面的 selectList 方法,并将返回值转成 json 返回。
如果我想在这个 API 里面 调用 bService 里的方法咋办?
@MarsApi(refBean="aService")
public interface TestApi {
// 这个注解可以覆盖类上面的 refBean
@MarsReference(beanName = "bService")
返回类型 selectList(ExpVO expVO);
}
我不想把 API 里的方法名称 写的跟 Service 一样咋办?
@MarsApi(refBean="aService")
public interface TestApi {
@MarsReference(refName = "要调用的 service 的方法名")
返回类型 selectList(ExpVO expVO);
}
我可以不调用方法,只返回 Service 里面的一个属性值吗?
@MarsApi(refBean="aService")
public interface TestApi {
@MarsReference(refName = "要调用的属性名", refType = RefType.PROPERTY)
返回类型 selectList(ExpVO expVO);
}
假如你不太适应这种写法
没关系,我们兼容常规的 Controller 写法
@MarsApi
public class DemoController {
@MarsWrite("userInfoServiceImpl")
private UserInfoService userInfoService;
public String demo(UserInfoDTO userInfoDTO, HttpMarsRequest request){
return "";
}
}
@RequestMethod注解
API的请求方式默认支持GET,POST,PUT,DELETE,如果想限制只支持某一种,可以在interface里面的方法上加上@RequestMethod注解
- 如果限制只支持一种:@RequestMethod(ReqMethod.POST)
- 如果限制多种:@RequestMethod({ReqMethod.POST, ReqMethod.PUT, ReqMethod.DELETE})
注意:目前接口只受理: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】 - 返回类型支持【任意类型】