4

我正在寻找一种更好的方法来从包含 HTTP 标头的字符串中提取数据。例如,我想从字符串的内容长度部分获取数字 160:“Content-Length: 160\r\n”。

似乎 HTTP 标头中的所有数据都以名称、冒号和空格开头,值之后紧跟 '\r' 和 '\n' 字符。

目前我正在这样做:

int contentLengthIndex = serverHeader.lastIndexOf("Content-Length: ");
int contentLastIndex = serverHeader.length()-1;
String contentText = serverHeader.substring(contentLengthIndex + 16, contentLastIndex);
contentText = contentText.replaceAll("(\\r|\\n)", "");
int contentLength = Integer.parseInt(contentText);

但它看起来很乱,它只适用于在字符串末尾获取“Content-Length”。是否有更好更通用的解决方案来从包含 HTTP 标头的字符串中提取值,该标头可以调整为同时获取 int 值或 String 值?

我还应该提到,连接需要能够在请求后将数据返回给浏览器,据我了解,这使我无法获得使用 HttpURLConnection 的好处。

4

4 回答 4

2

一个快速的解决方案是:

new Scanner(serverHeader).useDelimiter("[^\\d]+").nextInt());

如果要创建Hashtable标题的另一种方式:

 String[] fields = serverHeader.trim().split(":");

 String key = fields[0].trim();
 String value = fields[1].trim();

我不知道你为什么要写这本手册,已经有 API 了!

于 2013-02-10T16:44:10.447 回答
1

使用类 java.net.HttpURLConnection

编辑:还有方法 URLConnection.getContentLength() 和 URLConnection.getContentLengthLong()

于 2013-02-10T16:52:58.497 回答
0

您是否尝试过从字符串中删除所有非数字字符?

serverHeader = serverHeader.replaceAll("[^\\d.]", "");

于 2013-02-10T16:36:39.617 回答
0

如果您使用Socket类来读取HTTP数据,我建议您使用HttpURLConnection它,因为它为您提供了方便的方法来解析Header Fields.

它具有public Map getHeaderFields()可用于获取所有字段的方法。

如果您想要一个开始使用的指南,HttpURLConnection您可以在此处查看

于 2013-02-10T17:05:00.683 回答