【发布时间】:2016-06-23 09:55:20
【问题描述】:
我正在尝试找到用 Java 解析 RFC-822 文档的最简单方法。假设我有一个存储 HTTP 消息的消息队列。请求和响应。因此,通过与端口 80 建立套接字连接并从那里发送/检索消息,它们不会以“正常”方式检索。
在下面的代码中,我故意将“邮件”标头与 HTTP 消息混合在一起。这是为了证明两者并没有太大的不同。但这无关紧要。代码如下:
package httpexample;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.impl.io.DefaultHttpRequestParser;
import org.apache.http.impl.io.HttpTransportMetricsImpl;
import org.apache.http.impl.io.SessionInputBufferImpl;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
public class HttpExample {
// RFC 822
public static void main(String[] args) throws IOException, HttpException {
String str = "POST http://localhost:8080/foobar/1234567 HTTP/1.1\n" +
"Message-ID: <19815303.1075861029555.JavaMail.ss@kk>\n" +
"Date: Wed, 6 Mar 2010 12:32:20 -0800 (PST)\n" +
"From: someone@someotherplace.com\n" +
"To: someone@someplace.com\n" +
"Subject: some subject\n" +
"Mime-Version: 1.0\n" +
"Content-Type: text/plain; charset=us-ascii\n" +
"Content-Transfer-Encoding: 7bit\n" +
"X-From: one, some <some.one@someotherplace.com>\n" +
"X-To: one\n" +
"X-cc: \n" +
"X-bcc: \n" +
"X-Origin: Bob-R\n" +
"X-FileName: rbob (Non-Privileged).pst\n" +
"\n" +
"some message\n";
ByteArrayInputStream fakeStream = new ByteArrayInputStream(
str.getBytes());
HttpTransportMetricsImpl metrics = new HttpTransportMetricsImpl();
SessionInputBufferImpl inbuffer = new SessionInputBufferImpl(metrics, 1024);
inbuffer.bind(fakeStream);
HttpMessageParser<HttpRequest> requestParser =
new DefaultHttpRequestParser(inbuffer);
BasicHttpEntityEnclosingRequest request = (BasicHttpEntityEnclosingRequest)requestParser.parse();
for (Header hdr : request.getAllHeaders()) {
System.out.println(String.format("%-30s = %s", hdr.getName(), hdr.getValue()));
}
System.out.println(String.format("Request Line: %s", request.getRequestLine()));
System.out.println(String.format("Body\n------------------\n%s",
request.getEntity()));
}
}
输出如下:
Message-ID = <19815303.1075861029555.JavaMail.ss@kk>
Date = Wed, 6 Mar 2010 12:32:20 -0800 (PST)
From = someone@someotherplace.com
To = someone@someplace.com
Subject = some subject
Mime-Version = 1.0
Content-Type = text/plain; charset=us-ascii
Content-Transfer-Encoding = 7bit
X-From = one, some <some.one@someotherplace.com>
X-To = one
X-cc =
X-bcc =
X-Origin = Bob-R
X-FileName = rbob (Non-Privileged).pst
Request Line: POST http://localhost:8080/foobar/1234567 HTTP/1.1
Body
------------------
null
我想不通的是如何访问消息的正文。
我希望它有内容some message\n
我在BasicHttpEntityEnclosingRequest 中找不到任何可以给我这个值的方法。在我使用的早期版本中
HttpRequest request = requestParser.parse();
而不是
BasicHttpEntityEnclosingRequest request =
(BasicHttpEntityEnclosingRequest) requestParser.parse();
我将其更改为BasicHttpEntityEnclosingRequest,因为它具有getEntity 方法。但这会返回null。
所以我有点迷路了。
我在哪里可以找到尸体?
【问题讨论】:
标签: java http apache-httpcomponents