如今,我一直在开发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的controller方法来确保这一点。如果是这样,当被调用的方法不存在时,我会注意到这带有编译错误。问题是,我必须将真正的api处理程序的参数条件与代理进行同步。(这有点肮脏。)
是否可以使用相同的HttpServletRequest对象直接调用转发的控制器方法?
答案 0 :(得分:0)
您可以在调用控制器之前使用spring HandlerInterceptorAdapter进行拦截
答案 1 :(得分:0)
也许此解决方案可以为您提供帮助。
@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);
}