0

我最近正在开发一个应用程序,并且有一个用例,我向客户端返回一组响应,例如 ALLOW、DENY 和 PENDING。

假设服务返回的响应是 PENDING,我希望客户端在给定时间间隔后重试。这个间隔由服务器给出。

我想知道围绕这种用例建模我的服务响应的最佳实践是什么。我想有这样的回应:

字符串决定;长重试间隔时间;

但是对于决定 ALLOW 和 DENY,retryIntervalInMinutes 没有意义,不应返回。

对此建模的一种方法:

决策 - 抽象类 Allow 扩展决策 Deny 扩展决策 Pending 扩展决策

只有 Pending 对象将包含 retryIntervalInMinutes。

但这有其自身的问题,例如客户端如何在不使用 instanceof 或类型转换等的情况下破译这样的响应。

或者有没有其他更好的方法来模拟这种反应?

4

2 回答 2

0

为什么getRetryInterval()在抽象Decision类中没有默认返回 0 并在Pending具体类中覆盖它的方法?

此外,您可以有一个只在类isEntryAllowed()中返回的方法。trueAllow

您的客户可以只使用这两种方法来发现答案的含义,不需要isntanceof.

简单的枚举会更好,因为响应是不可变的单例:

public enum Response {

    ALLOW, DENY, RETRY; 

    public boolean isEntryAllowed() {
        return this == ALLOW;
    }

    public boolean isRetryAllowed() {
        return this == RETRY;
    }

    public int getRetryInterval() {
        return this == RETRY ? 42 : -1;
    }
}

客户端得到一些Response实例,并且可以使用它的方法来找出响应的含义:

Response respone = sendRequestToServer();
if (response.isEntryAllowed()) {
  // cool! let's move on!
} else if (response.isRetryAllowed()) {
   retryAfter(response.getRetryInterval());
} else {
  // too bad, need to find another server or sth
}
于 2013-10-02T06:46:18.927 回答
0

零也是一个数字。如果您的类有一个 retry-delay 属性,即应该等待的持续时间,那么对于不应该有延迟的情况,您可以将该属性设置为零。

对于将延迟传达给客户端的 Web 服务,名为 Retry-After 的标准 HTTP 标头是适当的媒介。

于 2013-10-02T07:29:51.480 回答