2013-07-24 39 views
4

我是新開發的Java Web服務(以前我已經在PHP和Ruby中完成了它們)。我正在寫一個資源是以下格式:Java - 解析RESTful資源URL的更好方法

<URL>/myService/<domain>/<app_name>/<system_name> 

正如你所看到的,我有一個三級資源標識符,而我試圖找出解析它的最好辦法。我將這個新服務添加到的應用程序不使用Jersey或任何這樣的RESTful框架。相反,它只是擴展HttpServlet。

目前他們正在關注這樣一個算法:

  • 呼叫request.getPathInfo()
  • 與路徑信息替換「/」字符「」字符
  • 使用String.substring方法從pathInfo字符串中爲該資源提取單個信息。

這對我來說似乎不是很優雅,而且我正在尋找更好的方法。我知道使用javax.ws.rs包使得這非常簡單(使用@Path和@PathParam註釋),但使用Jersey可能不是一種選擇。

僅使用基本的HttpServletRequest對象和標準Java庫,有沒有比上述方法更好的解析信息的方法?

+1

你能夠有多個servlet映射到不同的URL。也許每個資源都有一個。 –

回答

0

我相信你首先需要創建一個框架,用於在屬性文件或內存數據結構中存儲REST方法和類+方法映射。然後編寫一個接受所有REST請求的頂級servlet。根據從上下文開始的URL,您可以嘗試從屬性文件/內存數據結構中獲取映射,以找出哪個類以及哪個方法需要被調用。然後利用反射可以調用所需的方法。獲取方法響應並將其編組爲所需的內容類型格式併發送回servlet響應輸出流。

2

我和你有同樣的問題,因爲我沒有找到任何合適的庫,我決定寫URL-RESTify。您可以使用它或只是看看自己的解決方案,這是一個小項目。

2

我最近在我的一個應用程序中解決了這個問題。我的網址看起來像這樣。

/categories/{category}/subcategories/{subcategory} 

我的問題是,我想用一個Java類中的每個URL模式映射,這樣我就可以在正確的類調用來呈現數據。

我的應用程序使用Netty,但URL解析器不使用任何第三方庫。

這使我可以做的是解析來自瀏覽器的URL,生成一個包含鍵值對的映射(在本例中爲category和子類),並且實例化正確的處理程序每個唯一的網址格式。總而言之,只有大約150行Java代碼用於解析,應用程序設置和唯一URL模式的定義。

您可以查看在GitHub上的解析器代碼:https://github.com/joachimhs/Contentice/blob/master/Contentice.api/src/main/java/no/haagensoftware/contentice/util/URLResolver.java

UrlResolver。getValueForUrl將返回一個URLData與您需要了解有關網址的信息: https://github.com/joachimhs/Contentice/blob/master/Contentice.api/src/main/java/no/haagensoftware/contentice/data/URLData.java

一旦這個設置,我可以的URL與Netty的處理器關聯:

this.urlResolver.addUrlPattern("/categories", CategoriesHandler.class); 
this.urlResolver.addUrlPattern("/categories/{category}", CategoryHandler.class); 
this.urlResolver.addUrlPattern("/categories/{category}/subcategories", SubCategoriesHandler.class); 
this.urlResolver.addUrlPattern("/categories/{category}/subcategories/{subcategory}", SubCategoryHandler.class); 

在我的處理程序,我可以簡單地獲取參數圖:

String category = null; 
logger.info("parameterMap: " + getParameterMap()); 
if (getParameterMap() != null) { 
    category = getParameterMap().get("category"); 
} 

我希望幫助:)

+2

你的網址已經死了 – frostymarvelous

8

如何球衣UriTemplate?在其他的答案中提到

import com.sun.jersey.api.uri.UriTemplate; 

... 

String path = "/foos/foo/bars/bar"; 

Map<String, String> map = new HashMap<String, String>(); 
UriTemplate template = new UriTemplate("/foos/{foo}/bars/{bar}"); 
if(template.match(path, map)) { 
    System.out.println("Matched, " + map); 
} else { 
    System.out.println("Not matched, " + map); 
}  
+1

和匹配一樣,我們可以用它來通過替換變量值來創建'url's(比如'{foo}') –