在下面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参数允许您访问响应对象。
您可能需要Jetty 9 HttpClient
文档作为参考。
关于您问题的详细答案,请参阅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
)。
虽然前面的答案(第一个日期:2013-06_Jun-24)会让你开始,但需要比当前(Jetty v9.2)文档中更多的内容。
首先需要的是一种调用HttpClient来关闭/完成处理的方法——在CompleteListener完成后,需要调用HttpClient.stop()。如果这就是我们所做的,代码有时会崩溃(Java异常),这里显示了一种适当关闭HttpClient的可靠方法:
- 如何通知";消耗的内容";用于码头9.02。ContentListener
必须调用HttpClient.stop()方法,否则Jetty可能会使JVM缺少线程(或资源)。这就是这里讨论的问题:
- 在Jetty HttpClient Hang上寻求建议
做一些家务也很重要,以确保线程"在并发处理情况下发挥良好的"。