如何在构建GET请求时限制允许的参数和值?

时间:2011-12-30 15:46:15

标签: java http enums get

我正在尝试创建一个访问在线R​​ESTful API的库。 API定义了已实现方法的列表,并为每个方法和(在某些情况下)给定参数的允许值提供了参数。我想我想确保(A)只能调用实现的方法; (B)只能为给定方法定义允许的参数; (C)只允许给定参数的某些值,只允许这些值。

(A)使用枚举“方法”相对容易:

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

for(B)我认为Method的每个实例都需要拥有它自己的允许参数枚举和(C)一些参数,一个允许值的枚举,类似(如果这让任何人都很抱歉畏缩):

注意:以下代码不是有效的JAVA;它仅作为概念示例。

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

显然,Java中不允许使用本地枚举,因此无法做到这一点;而且我想有更多优雅的方法可以实现我的最终目标,但是我已经练习了5年多,所以我很难找到它们。

或者也许我正在过度思考并试图在我的请求的参数和价值中实现这种类型的安全是非常糟糕的做法(再次我不是很有经验) - 如果是这种情况,我会很感激解释为什么这是不好的做法。

谢谢,
- 伊戈尔

1 个答案:

答案 0 :(得分: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
    }
}