Java 从包含HTTP头的字符串中提取值

Java 从包含HTTP头的字符串中提取值,java,http,Java,Http,我正在寻找一种更好的方法从包含HTTP头的字符串中提取数据。例如,我想从字符串的content-length部分获取数字160:“content-length:160\r\n” HTTP头中的所有数据前面都有名称、冒号和空格,值后面紧跟着“\r”和“\n”字符 目前我正在这样做: int contentLengthIndex = serverHeader.lastIndexOf("Content-Length: "); int contentLastIndex = serverHeader.le

我正在寻找一种更好的方法从包含HTTP头的字符串中提取数据。例如,我想从字符串的content-length部分获取数字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);
但是它看起来很混乱,而且它只适用于获取字符串末尾的“内容长度”。对于从包含HTTP头的字符串中提取值,是否有更好的更通用的解决方案,可以对其进行调整以同时获取int值或字符串值


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

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


serverHeader=serverHeader.replaceAll(“[^\\d.]”,“”)

快速解决方案是:

new Scanner(serverHeader).useDelimiter("[^\\d]+").nextInt());
另一种方法是,如果要创建标题的
哈希表

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

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

我不知道你为什么要做这个手册,已经有了这个API

使用类java.net.HttpURLConnection


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

如果您使用
Socket
类读取
HTTP
数据,我建议您使用
HttpURLConnection
,因为它为您提供了解析
标题字段的方便方法

它有
publicmap getHeaderFields()
方法,您可以使用该方法获取所有字段


如果您想要开始使用
HttpURLConnection
的指南,您可以查看它。

您是如何获得标题的?@SuKu,我正在将它们逐个字符存储到字符串中。我现在远离代码,但我相信这是通过InputStreamReader实现的。肯定是一些
阅读器
,但是
阅读器
的来源是什么,我的意思是你可以继续使用
HttpURLConnection
,就像我在回答中提到的那样。@SuKu,不幸的是,我无法使用HttpURLConnection,因为我需要使用连接将数据发送回请求的浏览器。似乎有一个额外的参数。这似乎只适用于名称/值对的int值,并且似乎只有在已知“内容长度”为160时才起作用。如果有办法,我希望能够使用名称从名称/值中提取。我只使用硬编码字符串作为示例,只需将变量放在那里。@iTech,您指的是哪个API?我是新手,所以可能我用错了方法。例如,如果您使用
servlet
,您可以调用
request.getHeader(headerName)
。您问题中的代码没有显示您是如何建立连接的,也没有显示it客户端或服务器端我是否开始尝试建立连接,但在发送数据时遇到了问题。我基本上是在编写一个基本的web服务器。HttpURLConnection是否允许您接受HTTP请求并使用该连接发送包含HTML或文本文件等数据的响应?不,您不能这样做。但是看看这里。您可以使用类似的方法来解析标头。我还需要能够从字符串值的名称/值对中获取值。我必须能够在处理get请求后使用连接将数据返回到浏览器,我认为HttpURLConnection不允许这样做。有一些方法URLConnection.getContentLength()和URLConnection.getContentLengthLong()URL URL=新URL(“);URLConnection connection=URL.openConnection();long connectionLength=connection.getContentLengthLong();