Jax-rs http header 范围

Jax-rs http header range

我想在 Jax-rs 应用程序中使用 http header 'Range',我可以为此定义一个单元吗?例如,记录数。

我想实现的是将响应中返回的记录数限制为'Range'

的最大值

为了解析更复杂的参数,您可以实现 ParamConverter:

@Provider
public class RangeHeaderConverter implements ParamConverter<RangeHeader> {

    @Override
    public RangeHeader fromString(String value) {
        return RangeHeader.fromValue(value);
    }

    @Override
    public String toString(RangeHeader value) {
        return value.toString();
    }

}

RangeHeader 的实现可能如下所示:

public class RangeHeader {

    public static enum Unit {
        BYTES;
    }

    private Unit unit;

    private long from;

    private long to;

    public RangeHeader(Unit unit, long from, long to) {
        this.unit = unit;
        this.from = from;
        this.to = to;
    }

    public Unit getUnit() {
        return unit;
    }

    public long getFrom() {
        return from;
    }

    public long getTo() {
        return to;
    }

    public static RangeHeader fromValue(String range) {
        if (range == null) {
            return null;
        }
        String[] tokens = range.replace("Range: ", "").split("=");
        Unit unit = Unit.valueOf(tokens[0].toUpperCase());
        String[] fromTo = tokens[1].split("-");
        long from = Long.valueOf(fromTo[0]);
        long to = Long.valueOf(fromTo[1]);
        return new RangeHeader(unit, from, to);
    }

    public String toString() {
        return String.format("Range: %s=%d-%d", unit.name().toLowerCase(), from, to);
    }

}

您可以这样使用 class:

public Response get(@HeaderParam("Range") RangeHeader range) {
    //
}

注意:这只是一个快速+肮脏的实现,不处理特殊值或错误。