【问题标题】:How to restrict allowable parameters and values when building a GET request?构建 GET 请求时如何限制允许的参数和值?
【发布时间】:2011-12-30 15:46:14
【问题描述】:

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

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

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

对于 (B) 我在想 Method 的每个实例都需要有自己的允许参数枚举,对于 (C) 一些参数,允许值的枚举,有点像(如果这让任何人感到抱歉,我很抱歉畏缩):

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

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

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

或者我可能想多了,并试图在我的请求的参数和值中实现这种类型安全是非常糟糕的做法(同样我不是很有经验) - 如果是这种情况,我将不胜感激解释为什么这是不好的做法。

谢谢,
- 伊戈尔

【问题讨论】:

  • 你是在客户端还是服务器端限制方法和参数类型?

标签: java http enums get


【解决方案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
    }
}

【讨论】:

  • 当我看到他对我的评论的回复时,我打算提出这样的建议。我喜欢围绕服务调用构建一组代理类的想法。点赞。
  • 感谢显而易见的解决方案。 :P 我一直在研究这个问题太久了,我想我想多了,从那以后一直在错误的轨道上前进;应该休息一下,从不同的角度解决它。我试图概括一些不应该概括的东西
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多