2011-12-30 32 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

相关问题