2016-07-07 74 views
0

我目前对REST服务有问题:基本结构如下:在我的Tomcat上运行2个应用程序(我的新REST服务(S1)和另一个应用程序(S2))还提供REST呼叫)。应用程序应该一起工作,以便S1可以向S2发送请求。如果我在S1中使用硬编码的URL来调用S2,它会正常工作。但问题在于应用程序的路径因不同的端口或配置而改变。这些更改适用于这两个应用程序,因为它们都在同一个Tomcat服务器上。
基本上2路径看起来相似,从例如与​​或http://sys-example:8034/。因此,如果我在特定路径上调用S1,应用程序应该获取URL并构建自己的basePath,以便在同一台服务器上访问S2。我如何创建一个方法让我获得调用服务的路径。有没有办法使用ServletContext还是有更好的方法吗?根据被调用的URL更改REST URL

目前这是我在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"); 

回答

1

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

请检查链接URL

0

到达服务您可以提取使用URI对象的REST调用。例如:

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

这样,您可以轻松地将REST网址附加到S2。我希望帮助:)

0

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

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

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

我觉得request.getRequestURL()是你想要

1

什么?如果我有你的权利,你说你在不同的环境,例如运行的服务生产,开发,本地等,这意味着主机和端口不同。不过,您的服务的相对路径仍然相同。

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

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

编辑:

其他答案建议解决从request对象的路径。我disadvise这样做的原因如下:

  • 可能有使用情况下,你没有request。您的服务可能会有(现在或未来)其他接口,而不是通过HTTP

  • 由于您无法控制该值,因此您不应该依赖要调用的URL。考虑反向代理或负载平衡器。