2011-12-30 36 views
1

我想製作一個訪問在線R​​ESTful API的庫。 API定義了一個已實現方法的列表,並允許每個方法的參數以及(在某些情況下)給定參數的允許值。我想我想確保(A)只有實現的方法才能被調用; (B)只允許爲給定方法定義參數;和(C)對於給定參數只允許某些值,只允許這些值。如何在構建GET請求時限制允許的參數和值?

是比較容易的只是用枚舉「方法」(A):

public enum Method { 
    getObjectById, 
    getObjectBySearch, 
    ... 
} 

爲(B)我在想方法的每個實例,然後需要有它的允許參數的自己枚舉和(C )一些參數,允許值的枚舉,有點像(如果這讓任何人畏縮,我很抱歉):

注意:下面的代碼不是有效的JAVA;它只是作爲一個概念的例子。

public enum Method { 
    getObjectById() { 
     enum Parameter { 
      objectId; 
    }, 
    getObjectBySearch() { 
     enum Parameter { 
      query, 
      queryType() { 
       enum Type { type1, type2 } 
      } 
     } 
    } 
} 

顯然,當地枚舉被Java不允許,所以這不能做;我想有更多優雅的方式來實現我的最終目標,但是我已經練習了5年以上,所以我正在努力尋找它們。

或者我可能會反思這一點,試圖在我的請求的參數和值中實現這種類型的安全性是非常糟糕的做法(我也不是很有經驗) - 如果是這種情況,我會很感激爲什麼這是不好的做法的解釋。

感謝,
- 伊戈爾

+0

您是否試圖約束客戶端或服務器端的方法和參數類型? – Perception 2011-12-30 15:54:51

+0

@Perception客戶端 – ipetrik 2011-12-30 16:10:37

回答

1

你爲什麼不只是包裝這驗證其參數的服務對象中每一個方法調用?

public class Service { 
    public SomeObject getObjectById(String objectId) { 
     if (isNotValidObjectId(objectId) { 
      throw new IllegalArgumentException("objectId is invalid"); 
     } 
     // TODO call the appropriate method 
    } 

    public SomeObject getObjectBySearch(String query, QueryType queryType) { 
     if (isNotValidQuery(query) { 
      throw new IllegalArgumentException("query is invalid"); 
     } 
     if (queryType == null) { 
      throw new IllegalArgumentException("queryType is mandatory"); 
     } 
     // TODO call the appropriate method 
    } 
} 
+0

當我看到他對我的評論的迴應時,我會提出類似的建議。我喜歡圍繞服務調用構建一組代理類的想法。 Upvoting。 – Perception 2011-12-30 16:19:12

+0

感謝您的明顯解決方案。 :P 我一直在研究這個問題的時間太長了,我認爲我推翻了它,並且從此以後一直在顛覆錯誤的軌道;應該休息一下,並從另一個角度加以解決。我試圖推廣一些本不應該被推廣的東西 – ipetrik 2011-12-30 16:22:14

相關問題