72

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 に転送することもできませんでした。

これを達成するためのより適切な方法はありますか?前もって感謝します。

4

8 に答える 8