2011-07-11 47 views
1

我覺得這是不可能的,但我需要確認把它扔了之前...休息網址 - 有「/」作爲路徑值

我有一個GET REST端點使用此模式

/networks/{networkId}/publishers/{publisherId}/ratings 

我面臨的問題是,publisherId可能在其id中包含'/',就像id可能是「opt/foo/bar」(我們無法控制此ID,它是由我們的客戶提供給我們的)。

所以

/網絡/ 68 /出版/選擇/富/酒吧/等級 - 顯然是行不通的,得到一個URL不喜歡錯誤。 /networks/68/publishers/opt%2ffoo%2fbar/ratings - 也不起作用。同樣的錯誤。

我知道通過它作爲查詢參數將工作。但是我想知道是否有辦法讓它成爲一個路徑參數?

謝謝!

+0

我知道這是一種逃避,但用「/」的東西法定但未使用像斜線「_」下劃線會避免這個問題。 – Szocske

回答

2

URL編碼是正確的路要走,但它看起來像你的容器解碼斜線之前,澤西收到它。

假設你正在使用Tomcat,您可以嘗試說服Tomcat能夠允許編碼,請嘗試:

tomcat/bin/setenv.bat 
set 
CATALINA_OPTS="-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true" 

我不知道其他容器中也有類似的問題和設置。

+0

會嘗試一下,謝謝! – hese

+0

這工作得很好!謝謝! – hese

2

我沒試過,但理論上這應該在新澤西州工作:

@Path("/networks/{networkId}/publishers/") 
@GET 
public String get(@PathParam("networkId") String networkId, @Context UriInfo ui) { 
    java.util.List<PathSegment> segments = ui.getPathSegments(); 
    // Last segment is "ratings", the rest is your publisherId. 
} 
+0

@Szpcske這是一個很好的解決方法...我確信這會起作用。但我的問題是我也有不同的子端點/評級,/總結等,我希望他們有不同的方法處理。如果什麼都行不通,我想我可以爲所有/發佈商活動提供這個入口點,然後從中找出不同的方法。謝謝! – hese

+0

再次考慮路徑「/ networks/{networkId}/publishers /」,我不確定在「/ publishers」後面有哪個路徑段的網址可以匹配此路徑。所以我懷疑這個方法在我的情況下會被調用。但我必須嘗試一下。我今天在做一些重要的事情,所以這將不得不等到明天。謝謝! – hese