【问题标题】:parse http response bytes in java在java中解析http响应字节
【发布时间】:2014-10-24 14:27:49
【问题描述】:

我正在尝试在 java 中解析 byte[],它是 HTTP 响应的表示。有这个问题Is there any simple http response parser for Java?,这正是我的问题,但接受的答案对我没有帮助。如果我查看http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/io/HttpMessageParser.html,我不明白这对我有什么帮助。

【问题讨论】:

  • 什么机制为您提供了这个字节数组?您使用什么方法与 HTTP 服务器进行实际通信?
  • 数据来自 WARC 文件,通过网络爬虫收集。我知道有一个库可以解析整个 WARC 文件,但我将它与这个 Hadoop 映射器 github.com/ept/warc-hadoop 一起使用,它使用它自己的 WARCRecord 格式。围绕这个有多个路由,但我认为解析 HTTP 响应应该是可行的。
  • 您链接的文档说“此库当前不执行任何记录内的数据解析,例如 HTTP 标头或 HTML 正文。您可以简单地将服务器的响应读取为数​​组字节。在未来的版本中可能会添加额外的解析功能。 -- 这是否意味着字节数组只能用于创建显示文本 HTTP 响应的字符串?
  • 是的,完全正确。你会得到类似HTTP/1.1 301 Moved Permanently Alternate-Protocol: 80:quic,p=0.01 Cache-Control: public, max-age=2592000 Content-Length: 218 Content-Type: text/html; charset=UTF-8 Date: Fri, 24 Oct 2014 14:43:20 GMT Expires: Sun, 23 Nov 2014 14:43:20 GMT Location: http://www.google.nl/ Server: gws X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1>
  • 是的,就是这样。谢谢你的帮助。我会尝试这样做或找到其他路线。不是要对任何人采取这种态度,但真的吗? asset-3.soup.io/asset/2905/6018_3568_450.jpeg.

标签: java parsing http byte response


【解决方案1】:

我希望这能让你开始

String s = "HTTP/1.1 200 OK\r\n" +
        "Content-Length: 100\r\n" +
        "Content-Type: text/plain\r\n" +
        "Server: some-server\r\n" +
        "\r\n";
SessionInputBufferImpl sessionInputBuffer = new SessionInputBufferImpl(new HttpTransportMetricsImpl(), 2048);
sessionInputBuffer.bind(new ByteArrayInputStream(s.getBytes(Consts.ASCII)));
DefaultHttpResponseParser responseParser = new DefaultHttpResponseParser(sessionInputBuffer);
HttpResponse response = responseParser.parse();
System.out.println(response);

此代码产生以下输出:

HTTP/1.1 200 OK [Content-Length: 100, Content-Type: text/plain, Server: some-server]

【讨论】:

  • 谢谢!这确实让我开始了。
  • 仅供参考,这些类来自 Apache HttpCore
【解决方案2】:

看看这个:https://github.com/ipinyol/proxy-base

这是一个简单的高度可配置的 http 代理。 org.mars.proxybase.ProxyThread 类的方法 readHeader 解析给定 DataInputStream 的 http 标头(按字节读取)并返回 Header 类型的对象,其中包含有关标头的信息。

另外,您可能知道您在标头中定义了内容长度,或者您有分块数据,您必须在 http 响应中按块读取。同一个类的 readContent 和 readContentByChunk 方法执行内容的读取。您可以自行探索代码并进行相应修改。

【讨论】:

  • 谢谢。我希望有一种工作强度较小的方法,但如果没有别的办法,可能会尝试这样做。
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多