我目前遇到REST服务问题:基本构造如下:在我的Tomcat上运行2个应用程序(我的新REST服务(S1)和另一个也提供REST调用的应用程序(S2))。应用程序应该一起工作,以便S1可以向S2发送请求。如果我在S1中使用硬编码URL来调用S2,它可以正常工作。但问题是应用程序的路径由于不同的端口或配置而发生变化。这些更改适用于两个应用程序,因为它们都位于同一个Tomcat服务器上
基本上,2个路径看起来相似,例如从使用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");
答案 0 :(得分:1)
如果我说得对,那就说你在不同的环境中运行服务,例如生产,开发,本地等,这意味着主机和港口不同。但是,服务的相对路径保持不变。
然后,对相对路径进行硬编码是绝对可以的,因为它们不会改变。但是,主机和端口应该是可配置的。您可以从数据库加载它们,以防您在需要这些数据之前访问数据库。
另一种解决方案可能是在Web容器中配置主机和端口。如果您应该使用Tomcat作为Web容器,请创建一个属性文件,并在引导应用程序时加载它。
编辑:
其他答案建议解决request
对象的路径。由于以下原因,我不赞成这样做:
可能存在您没有request
的用例。可能(现在或将来)您的服务的其他接口比通过HTTP
由于您无法控制该值,因此您不应该依赖要调用的URL来调用。想想反向代理或负载均衡器。
答案 1 :(得分:1)
如果您确定2个servlet将在同一个Tomcat安装中运行,而且在相同的上下文中,我建议使用直接交互。
请查看此URL的链接。
答案 2 :(得分:0)
您可以使用URI对象提取REST调用。例如:
URI u = URI.create("http://www.example.com:8080/rest/service/call");
String restPath = u.getPath();
System.out.println(restPath);
这样,您可以轻松地将REST URL附加到S2。我希望有帮助:)
答案 3 :(得分:0)
您可以从HttpServletRequest
对象中获取所需的详细信息。
以下代码必须为您提供所需的详细信息。我没有对此进行测试,但这应该可以让你开始。
StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String host = url.substring(0, url.indexOf(uri));
答案 4 :(得分:0)
我认为request.getRequestURL()
就是你想要的