Java 根据调用的URL更改REST URL
我目前在使用REST服务时遇到了一个问题:基本结构如下:在我的Tomcat上,有两个应用程序正在运行(我的新REST服务(S1)和另一个也提供REST调用的应用程序(S2))。应用程序应协同工作,以便S1可以向S2发送请求。如果我在S1中使用硬编码的url调用S2,效果会很好。但问题是,由于端口或配置不同,应用程序的路径也在变化。更改适用于两个应用程序,因为它们都位于同一个Tomcat服务器上。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
基本上,这两条路径看起来很相似,例如从
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,因为您无法控制这些值。请考虑反向代理或负载平衡器
请求
对象的路径。我不建议这样做,原因如下:
- 在某些用例中,您可能没有
。除了通过HTTP,您的服务可能还有(现在或将来)其他接口请求
- 您不应该根据传入的请求来依赖于要调用的URL,因为您无法控制这些值。请考虑反向代理或负载平衡器
请检查此处的链接。如果您确定这两个servlet将在相同的Tomcat安装中运行,而且,在相同的上下文中,我建议使用直接交互 请查看此处的链接