我正在寻找一种更好的方法从包含HTTP标头的String中提取数据。例如,我想从字符串的内容长度部分获取数字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标头的String中提取值,该标头可以调整为用于获取int值或String值?
我还应该提一下,连接需要能够在请求之后将数据返回给浏览器,根据我的理解,这使我无法获得使用HttpURLConnection的好处。
答案 0 :(得分:2)
快速解决方案将是:
new Scanner(serverHeader).useDelimiter("[^\\d]+").nextInt());
另一种方法,如果你想创建标题的Hashtable
:
String[] fields = serverHeader.trim().split(":");
String key = fields[0].trim();
String value = fields[1].trim();
我不确定你为什么要这本手册,已经有了这个API!
答案 1 :(得分:0)
您是否尝试过剥离字符串中的所有非数字字符?
serverHeader = serverHeader.replaceAll("[^\\d.]", "");
答案 2 :(得分:0)
如果您使用Socket
课程阅读HTTP
数据,建议您使用HttpURLConnection
,因为它为您提供了解析Header Fields
的便捷方法。
它有public Map getHeaderFields()
方法,您可以使用它来获取所有字段。
如果您希望指南开始使用HttpURLConnection
,您可以看到它here。