spring mvc フレームワークを使用して REST サービスを公開する Web アプリケーションを構築しました。例えば:
@Controller
@RequestMapping("/movie")
public class MovieController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public @ResponseBody Movie getMovie(@PathVariable String id, @RequestBody user) {
return dataProvider.getMovieById(user,id);
}
ここで、アプリケーションをデプロイする必要がありますが、次の問題があります。クライアントは、アプリケーションが存在するコンピューターに直接アクセスできません (ファイアウォールがあります)。したがって、実際の残りのサービスを呼び出すプロキシ マシン (クライアントからアクセス可能) にリダイレクト レイヤーが必要です。
RestTemplate を使用して新しい呼び出しを試みました: 例:
@Controller
@RequestMapping("/movieProxy")
public class MovieProxyController {
private String address= "http://xxx.xxx.xxx.xxx:xx/MyApp";
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public @ResponseBody Movie getMovie(@PathVariable String id,@RequestBody user,final HttpServletResponse response,final HttpServletRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange( address+ request.getPathInfo(), request.getMethod(), new HttpEntity<T>(user, headers), Movie.class);
}
これで問題ありませんが、resttemplate を使用するには、コントローラーの各メソッドを書き直す必要があります。また、これにより、プロキシ マシンで冗長なシリアライゼーション/デシリアライゼーションが発生します。
restemplate を使用してジェネリック関数を作成しようとしましたが、うまくいきませんでした:
@Controller
@RequestMapping("/movieProxy")
public class MovieProxyController {
private String address= "http://xxx.xxx.xxx.xxx:xx/MyApp";
@RequestMapping(value = "/**")
public ? redirect(final HttpServletResponse response,final HttpServletRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange( address+ request.getPathInfo(), request.getMethod(), ? , ?);
}
リクエストおよびレスポンス オブジェクトで動作する resttemplate のメソッドが見つかりませんでした。
春のリダイレクトとフォワードも試しました。しかし、リダイレクトはリクエストのクライアント IP アドレスを変更しないので、この場合は役に立たないと思います。別の URL に転送することもできませんでした。
これを達成するためのより適切な方法はありますか?前もって感謝します。