2015-05-30 34 views
2

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

我想实现是限制在响应返回的“范围”

回答

3

最大值记录数量为了解析更复杂的参数可以实现一个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); 
    } 

} 

你可以使用这个类是这样的:

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

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