如今,我一直在制作API系统,而且我遇到了有关转发请求的问题。
在我的API系统中,来自用户的所有请求首先进入代理控制器,然后将请求转发到实际API版本化。
// proxy controller
@Controller
@RequestMapping("/proxy")
public class ProxyController {
private static final String VERSION = "v1";
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String getUsers() {
return String.format("forward:/%s/users", VERSION);
}
}
// Real API controller
@RestController("v1UsersController")
@RequestMapping("/v1/users")
public class UsersController {
@RequestMapping(value = "/users", method = RequestMethod.GET)
public ApiResultsResponse<Users> findUsers(@RequestParam userId, ...) {
// ...
// ...
// ...
// return users found
}
我找到了代理控制器,因为当某些情况发生时,我可以轻松地更改真正的api,比如升级api的版本。
但是,因为我使用了使用String的转发(在本例中为return String.format("forward:/%s/users", VERSION)
),我不确定当前是否存在转发的真实api。
所以我想通过直接调用真正的api控制器方法来确定这一点。如果是这样,当被调用的方法不存在时,我会注意到编译错误。问题是,我必须将真正的api处理程序的参数条件与代理的同步。(这有点脏。)
是否可以使用相同的HttpServletRequest对象直接调用转发的控制器方法?
在调用控制器之前,可以使用spring HandlerInterceptorAdapter进行拦截
也许这个解决方案会帮助你。
@RequestMapping(value = "/users", method = RequestMethod.GET)
public void getUsers(HttpServletRequest request,HttpServletResponse response) {
String path = String.format("forward:/%s/users", VERSION);
RequestDispatcher dispatcher=request.getRequestDispatcher(path);
dispatcher.forward(request, response);
}