2017-07-26 40 views
0

我試圖在我的webapp運行的服務器上連接到Spring RESTful服務Spring RestTemplate:URI不是絕對的

我想使用「相對」路徑,因爲它可以安裝在幾個環境(本地主機,測試,生產),但我得到的錯誤消息:URI is not absolute

如何在同一臺服務器上調用另一個webapp上運行的服務?

我的代碼是像以下:

final RestTemplate restTemplate = new RestTemplate(); 
URI uri; 
try { 
    String url = "app2/myservice?par=1"; 
    uri = new URI(url); 
    String result = restTemplate.getForObject(uri, String.class); 
    System.out.println(result); 
} catch (URISyntaxException e) { 
    logger.error(e.getMessage()); 
} 

感謝。

更新:

我解決它通過讓主機,端口等......從request,可以說,它是一個正確而優雅的解決方案?這是我的實際簡化代碼:

String scheme = request.getScheme(); 
String userInfo = request.getRemoteUser(); 
String host = request.getLocalAddr(); 
int port = request.getLocalPort(); 
String path = "/app2/myservice"; 
String query = "par=1"; 
URI uri = new URI(scheme, userInfo, host, port, path, query, null); 
boolean isOK = restTemplate.getForObject(uri, Boolean.class); 
if (isOK) { 
    System.out.println("Is OK"); 
} 
+3

編碼不適合網址!它的參數值。刪除這一行:'String urlEncoded = URLEncoder.encode(url,UTF_8);' –

+0

好的,我刪除了編碼,但無論如何我需要指定一個相對的url,這可能嗎?謝謝 – Alessandro

+0

相對於什麼?沒有任何上下文,應用程序不知道它是如何從外部訪問的。如果你有權訪問HttpServletRequest,你可以看到那個對象認爲你的應用程序被訪問過,但即使這樣也不需要完美,如果在你自己的Java應用服務器前面有反向代理。在瀏覽器中運行JavaScript代碼很容易,但對於服務器端應用程序來說確實很難。 –

回答

0

您不能在第一個代碼段中將其作爲代碼執行;該URI必須完全識別您嘗試訪問的資源。你的第二個片段幾乎是你做你想做的事的唯一方法。可能還有其他的方法,但我想不出任何我的頭頂。

當然,你的方法,你在使喚你的系統架構和部署模型代碼,這幾乎不是一個好主意。

0

您的網址app2/myservice?par=1如果您的服務在另一個Web應用程序或同一服務器上運行,則不完整。

你必須通過給出基地址的方式來完成路徑localhost:8080/yourApp/app2/myservice?par=1那麼事情可能適合你。

此外,請檢查包訪問權限。

相關問題