在下面Jetty的文档示例中,描述了一种执行高效异步HTTP请求的简单方法。但是,在这个例子中,它从未指定你实际应该如何检索服务器的回复,我似乎无法弄明白。
Result对象有getResponse()和getRequest(),但它们都没有访问内容的方法。
有人知道吗?
Jetty的文档
可以用这种方式编写简单的异步GET请求:
httpClient.newRequest("http://domain.com/path")
.send(new Response.CompleteListener()
{
@Override
public void onComplete(Result result)
{
// Your logic here
}
});
方法Request.send(Response.CompleteListener)返回void并且不阻塞;作为参数提供的Response.CompleteListener在请求/响应对话完成时得到通知,Result参数允许您访问响应对象。
答案 0 :(得分:8)
您可能希望将Jetty 9 HttpClient
documentation作为参考。
here部分Response Content Handling
解释了对您的问题的详尽答案。
如果您将普通CompleteListener
传递给Request.send(CompleteListener)
,则表示您对内容不感兴趣,而这些内容将被丢弃。
如果您对内容感兴趣,但仅在完成响应时,您可以传递提供的实用程序类,例如BufferingResponseListener
:
request.send(new BufferingResponseListener() { ... });
如果您对内容的到来感兴趣,则应传递Response.ContentListener
,它将通过块通知您内容块。
您可以通过两种方式执行此操作:使用Response.Listener
(扩展Response.ContentListener
):
request.send(new Response.Listener()
{
public void onContent(...) { ... }
public void onComplete(...) { ... }
});
或使用多个侦听器:
request.onResponseContent(new Response.ContentListener() { ... });
request.send(new CompleteListener() { ... });
您拥有所需的所有灵活性,以及可以帮助您的开箱即用的实用程序类(无需编写复杂的缓冲代码,只需使用BufferingResponseListener
)。
答案 1 :(得分:0)
虽然较早的答案(第一次约会:2013-06_Jun-24)将帮助您入门,但需要的工作比当前(Jetty v9.2)文档中的要多。
首先需要调用HttpClient来关闭/完成处理 - 在CompleteListener完成后需要调用 HttpClient.stop()。如果这就是我们所做的一切,那么代码有时会崩溃(Java异常),这里显示了一个可靠的关闭HttpClient的方法:
必须调用HttpClient.stop()方法,否则Jetty可能会使JVM缺少线程(或资源)。这是这里讨论的问题:
做一些家务工作以确保线程好玩'这一点也很重要。在并发处理的情况下。