Java 根据调用的URL更改REST URL

Java 根据调用的URL更改REST URL,java,rest,Java,Rest,我目前在使用REST服务时遇到了一个问题:基本结构如下:在我的Tomcat上,有两个应用程序正在运行(我的新REST服务(S1)和另一个也提供REST调用的应用程序(S2))。应用程序应协同工作,以便S1可以向S2发送请求。如果我在S1中使用硬编码的url调用S2,效果会很好。但问题是,由于端口或配置不同,应用程序的路径也在变化。更改适用于两个应用程序,因为它们都位于同一个Tomcat服务器上。 基本上,这两条路径看起来很相似,例如从http://localhost:8080/或http://s

我目前在使用REST服务时遇到了一个问题:基本结构如下:在我的Tomcat上,有两个应用程序正在运行(我的新REST服务(S1)和另一个也提供REST调用的应用程序(S2))。应用程序应协同工作,以便S1可以向S2发送请求。如果我在S1中使用硬编码的url调用S2,效果会很好。但问题是,由于端口或配置不同,应用程序的路径也在变化。更改适用于两个应用程序,因为它们都位于同一个Tomcat服务器上。
基本上,这两条路径看起来很相似,例如从
http://localhost:8080/
http://sys-example:8034/
。因此,如果我在特定路径上调用S1,应用程序应该获取URL并构建自己的basePath以到达同一服务器上的S2。如何创建一个方法来获取调用服务的路径。有没有一种方法可以使用
ServletContext
还是有更好的方法

目前,这是我在S1中的代码,用于到达S2中的服务

String path = configMap.get("basePath").toString(); 
//configMap is a HashMap which contains Data from an config file
//the result of get("basePath") looks like this: http://localhost:8080
path = path.concat("/otherService/rest/action/login");

您可以使用URI对象提取REST调用。例如:

URI u = URI.create("http://www.example.com:8080/rest/service/call");
String restPath = u.getPath();
System.out.println(restPath);

通过这种方式,您可以轻松地将RESTURL附加到S2。我希望这会有所帮助:)

您可以使用URI对象提取REST调用。例如:

URI u = URI.create("http://www.example.com:8080/rest/service/call");
String restPath = u.getPath();
System.out.println(restPath);

通过这种方式,您可以轻松地将RESTURL附加到S2。我希望这有帮助:)

您可以从
HttpServletRequest
对象获取所需的详细信息

以下代码必须提供所需的详细信息。我还没有测试过这个,但这应该让你开始

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String host = url.substring(0, url.indexOf(uri));

您可以从
HttpServletRequest
对象获取所需的详细信息

以下代码必须提供所需的详细信息。我还没有测试过这个,但这应该让你开始

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String host = url.substring(0, url.indexOf(uri));

我认为
request.getRequestURL()
是您想要的

我认为
request.getRequestURL()
是您想要的

如果我说得对,您是说您在不同的环境中运行服务,例如生产、开发、本地等,这意味着主机和端口不同。但是,到您的服务的相对路径保持不变

然后,硬编码相对路径是完全可以的,因为它们不会改变。但是,主机和端口应该是可配置的。您可以从数据库中加载它们,以防在需要这些数据之前访问数据库

另一个解决方案可能是在web容器中配置主机和端口。如果您应该使用Tomcat作为web容器,请创建一个属性文件,并在应用程序启动时加载它

编辑:

其他答案建议解析
请求
对象的路径。我不建议这样做,原因如下:

  • 在某些用例中,您可能没有
    请求
    。除了通过HTTP,您的服务可能还有(现在或将来)其他接口

  • 您不应该根据传入的请求来依赖于要调用的URL,因为您无法控制这些值。请考虑反向代理或负载平衡器


如果我没记错的话,您是说您在不同的环境中运行服务,例如生产、开发、本地等,这意味着主机和端口不同。但是,到您的服务的相对路径保持不变

然后,硬编码相对路径是完全可以的,因为它们不会改变。但是,主机和端口应该是可配置的。您可以从数据库中加载它们,以防在需要这些数据之前访问数据库

另一个解决方案可能是在web容器中配置主机和端口。如果您应该使用Tomcat作为web容器,请创建一个属性文件,并在应用程序启动时加载它

编辑:

其他答案建议解析
请求
对象的路径。我不建议这样做,原因如下:

  • 在某些用例中,您可能没有
    请求
    。除了通过HTTP,您的服务可能还有(现在或将来)其他接口

  • 您不应该根据传入的请求来依赖于要调用的URL,因为您无法控制这些值。请考虑反向代理或负载平衡器


如果您确信这两个servlet将在相同的Tomcat安装中运行,而且在相同的上下文中运行,我建议使用直接交互


请检查此处的链接。

如果您确定这两个servlet将在相同的Tomcat安装中运行,而且,在相同的上下文中,我建议使用直接交互

请查看此处的链接