5

在下面来自 Jetty 文档的示例中,描述了一种执行高效异步 HTTP 请求的简单方法。但是,它从未指定在此示例中您实际上应该如何检索服务器的回复,我似乎无法弄清楚。

Result 对象有 getResponse() 和 getRequest(),但它们都没有访问内容的方法。

有人知道吗?


码头的文档

一个简单的异步 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 参数允许您访问响应对象。

4

2 回答 2

9

您可能希望将 Jetty 9HttpClient 文档作为参考。

您的问题的详细答案在此处进行了解释,部分Response Content Handling

如果你传递一个plain CompleteListenerto Request.send(CompleteListener),这意味着你对内容不感兴趣,这些内容将被丢弃。

如果您对内容感兴趣,但仅在响应完成时,您可以传递提供的实用程序类,例如BufferingResponseListener

request.send(new BufferingResponseListener() { ... });

如果您对到达时的内容感兴趣,您应该传递 a 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-24T16:06:57.437 回答
0

虽然较早的答案(第一次日期:2013-06_Jun-24)会让您入门,但需要的不仅仅是当前(Jetty v9.2)文档中的内容。

需要的第一件事是调用 HttpClient 以关闭/完成处理的方法——您需要在 CompleteListener 完成后调用HttpClient.stop() 。如果这就是我们所做的一切,代码有时会崩溃(Java 异常),这里显示了一种适当关闭 HttpClient 的可靠方法:

必须调用 HttpClient.stop() 方法,否则 JVM 可能会被 Jetty 耗尽线程(或资源)。这是这里讨论的问题:

做一些家务以确保线程在并发处理情况下“运行良好”也很重要。

于 2014-10-29T23:16:41.733 回答