gpt4 book ai didi

java - 从 HttpHeader 中获取范围值

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:42 24 4
gpt4 key购买 nike

出于分页目的,我们的 UI 人员在 Http header 中指定项目范围,如下所示:

Range: items=0-15

在随后的请求中,来自网络的范围可以是

Range: items=16-31
Range: items=32-45

...等...等

在我的 Controller SearchRequestController.java 中,我试图提取这些范围,以便我可以将它发送到 Solr 服务器以通过设置起始和偏移量返回请求的卡盘中的值。

我正在做的事情如下(在 SearchRequestController.java 中):

@RequestMapping("/billsSearch")
@ResponseBody
public SearchResult searchBills(HttpServletRequest request,@RequestBody SearchRequest searchRequest){
String rangeRequest = request.getHeader("Range");
//(1)Parse the rangeRequest using some mechanism
//(2)Set the start using the first value of the range
//(3) Add the second value to the start to get the offset
searchRequest.setStart(startValue);
searchRequest.setOffset(offsetValue);
return searchHelper(request,searchRequest);
}

我有几个问题:这是从服务器以分块方式请求数据的最佳方式吗?

如何从请求 header 中提取范围?

我假设 request.getHeader("Range") 将返回“items=16-31”。

正则表达式是从这个字符串中获取 16 和 31 的最佳方式吗?

如果我决定使用正则表达式,如果我将范围 header 更改为 billItems=16-31,表达式不会中断吗?

我是正则表达式 n00b,所以我很可能以错误的方式思考这个问题。

是否有正则表达式的替代方法来从 SpringMVC 中的 http header 解析这样的范围信息?

最佳答案

符合http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 的简单范围 header 解析器

class Range {
Integer start;
Integer end;
Integer suffixLength;
}

public class Main {

public static void main(String[] args) {
String input = "bytes=33-22,-333,20-,-55,43-0002";
for (Range range : decodeRange(input)) {
if (range.suffixLength == null) {
System.out.printf("Range: %d->%s\n", range.start, range.end == null ? "enf of file" : range.end);
} else {
System.out.printf("Last %d bytes\n", range.suffixLength);
}
}
}

public static List<Range> decodeRange(String rangeHeader) {
List<Range> ranges = new ArrayList<>();
String byteRangeSetRegex = "(((?<byteRangeSpec>(?<firstBytePos>\\d+)-(?<lastBytePos>\\d+)?)|(?<suffixByteRangeSpec>-(?<suffixLength>\\d+)))(,|$))";
String byteRangesSpecifierRegex = "bytes=(?<byteRangeSet>" + byteRangeSetRegex + "{1,})";
Pattern byteRangeSetPattern = Pattern.compile(byteRangeSetRegex);
Pattern byteRangesSpecifierPattern = Pattern.compile(byteRangesSpecifierRegex);
Matcher byteRangesSpecifierMatcher = byteRangesSpecifierPattern.matcher(rangeHeader);
if (byteRangesSpecifierMatcher.matches()) {
String byteRangeSet = byteRangesSpecifierMatcher.group("byteRangeSet");
Matcher byteRangeSetMatcher = byteRangeSetPattern.matcher(byteRangeSet);
while (byteRangeSetMatcher.find()) {
Range range = new Range();
if (byteRangeSetMatcher.group("byteRangeSpec") != null) {
String start = byteRangeSetMatcher.group("firstBytePos");
String end = byteRangeSetMatcher.group("lastBytePos");
range.start = Integer.valueOf(start);
range.end = end == null ? null : Integer.valueOf(end);
} else if (byteRangeSetMatcher.group("suffixByteRangeSpec") != null) {
range.suffixLength = Integer.valueOf(byteRangeSetMatcher.group("suffixLength"));
} else {
throw new RuntimeException("Invalid range header");
}
ranges.add(range);
}
} else {
throw new RuntimeException("Invalid range header");
}
return ranges;
}
};

或者看看here

关于java - 从 HttpHeader 中获取范围值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com