2011-10-03 25 views
4

我有一個調用RESTEasy(JAX-RS)Java服務器的Java客戶端。我的一些用戶有可能擁有比服務器更新版本的客戶端。JAX-RS和未知查詢參數

該客戶端可能會調用服務器上包含服務器不知道的查詢參數的資源。是否有可能在服務器端檢測到並返回錯誤?

我明白,如果客戶端調用服務器上尚未實現的URL,則客戶端將收到404錯誤,但如果客戶端傳入的查詢參數未實現(如:?sort_by=last_name )?

回答

4

是否有可能在服務器端檢測到這一點並返回錯誤?

是的,你可以做到。我認爲最簡單的方法是使用@Context UriInfo。您可以通過調用getQueryParameters()方法來獲取所有查詢參數。所以你知道是否有任何未知的參數,你可以返回錯誤。

,但如果客戶端通過在如果實現的處理「未知」的參數沒有特殊的支持,沒有實現

查詢參數會發生什麼,資源將被調用,參數會默默地忽略。

我個人認爲最好忽略未知參數。如果你忽略它們,它可能有助於使API向後兼容。

+0

如果未知查詢參數代表一個「暗示」,如排序順序,那麼我同意,存在忽視它沒有傷害,但如果查詢參數是什麼比如「/ users?last_name = j *」,這意味着調用者只需要以「j」開頭的用戶,並且服務器返回所有用戶,而不是可能是prob LEM。 – Ralph

+0

在你回答這個問題之前,我已經提出了這個問題,但是希望有更好的方法:-)。我將嘗試使用註釋做一些事情,以便參數檢查方法可以掃描資源方法的參數並自動確定允許的一組查詢參數。我也在研究方面,允許一個橫切方法自動檢查這個(和其他的東西,如安全)。 – Ralph

0

您應該確定檢出JAX-RS過濾器(org.apache.cxf.jaxrs.ext.RequestHandler)以攔截,驗證和操縱請求,例如,用於安全或有效的查詢參數。

如果您使用註釋聲明瞭所有參數,則可以解析資源類名稱的web.xml文件(請參閱下面的可能正則表達式),並使用完全限定類名訪問方法的聲明註釋(如javax.ws .rs.GET)和方法參數(如javax.ws.rs.QueryParam)掃描所有可用的Web服務資源 - 這樣您就不必手動將所有資源類添加到您的過濾器。 將這些信息存儲在靜態變量中,因此您只需在第一次打開過濾器時解析這些信息。

在您的過濾器中,您可以訪問傳入請求的org.apache.cxf.message.Message。查詢字符串很容易訪問 - 如果您還想驗證表單參數和多部分名稱,則必須重新收集消息內容並將其寫回消息(由於必須處理多部分邊界等,因此這會變得有點令人討厭) 。

爲「索引」的資源,我只取HTTP方法和追加的路徑(然後用作鍵進入申報參數。

您可以使用ServletContext中讀取web.xml文件。對於提取的資源類這個表達式可能會有所幫助

String webxml = readInputStreamAsString(context.getResourceAsStream("WEB-INF/web.xml")); 
Pattern serviceClassesPattern = Pattern.compile("<param-name>jaxrs.serviceClasses</param-name>.*?<param-value>(.*?)</param-value>", Pattern.DOTALL | Pattern.MULTILINE);