java - 使用 AsyncHttpClient 接收部分响应正文

标签 java json asynchttpclient

我正在使用 AsyncHttpClient 编写 REST 服务使用者类。该服务返回一个 JSON 响应字符串,其中包含许多我不需要的额外数据。我只对收到的回复的特定部分感兴趣。

例如,考虑以下 JSON 响应:

{
    "decisions": {
        "foo": "foo",
        "bar": "bar"
    }
    "internals": {
        "foobar": "foobar"
    }
}

现在,我只对 decisions 对象感兴趣,不想浪费时间和内存来获取 internals 因为这在实际响应中是巨大的,我确实这样做不需要它。

是否可以使用AsyncHttpClient?我该如何实现这一目标?

这是我的类的代码片段:

AsyncHttpClient c = new AsyncHttpClient();
Future<String> f = c.prepareGet("http://www.foo.org/ba").execute(new AsyncHandler<String>() {
    private ByteArrayOutputStream bytes = new ByteArrayOutputStream();

    @Override
    public STATE onStatusReceived(HttpResponseStatus status) throws Exception {
        return STATE.CONTINUE;
    }

    @Override
    public STATE onHeadersReceived(HttpResponseHeaders h) throws Exception {
         return STATE.CONTINUE;
    }

    @Override
    public STATE onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception {
         /* What shall I write here? */
         return STATE.CONTINUE;
    }

    @Override
    public String onCompleted() throws Exception {
         return bytes.toString("UTF-8");
    }

    @Override
    public void onThrowable(Throwable t) {
        /* TODO : Throw Exception */
    }
});

String bodyResponse = f.get();

最佳答案

HTTP 建立在 TCP 之上,因此它本质上是分块的。您会在 onBodyPartReceived 中收到有关这些字节 block 的通知。这些 block 的长度通常为 1 MTU .

您想要实现的目标需要:

  • 您确信您要查找的内容位于第一个 block 中
  • 您确信您不会得到未映射到您的字符编码的乱七八糟的字节(以 2 个或更多字节编码的单个字符,并跨越 2 个连续的 block )。您只能确定您的编码是否为 US-ASCII,而不是 UTF-8。
  • 您可以使用 JSON 解析器(可能是正则表达式)以外的其他工具来解析部分响应正文,因为您不会获得有效的 JSON 负载。

如果您可以确保所有这些假设都有效,则可以在 onBodyPartReceived 中执行此提取并返回 STATE.ABORT

关于java - 使用 AsyncHttpClient 接收部分响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36576272/

相关文章:

java - 回调监听器无法正常工作

apache-spark - 由 async-http-client 引起的 Spark 中的 IllegalAccessError

java - 异常 org.apache.jasper.JasperException : java. lang.NullPointerException 根本原因 java.lang.NullPointerException

java - 如何在 Android 中声明类的数组时消除错误

带有 ClassLoader 的 Java 示例

javascript - 使用 jquery ajax 在同一请求中上传文件和 JSON 数据?

javascript - 适用于多个地点的 Google Maps JavaScript API v3 : getDetails(request, 回调)

java - java中的解析器JSON文件JSONARRAY和JSONOBJECT

python - Tornado AsyncHTTPClient动态添加http_client.fetch到列表

java - 如何使用 Netty 关闭异步 Http 请求的 AsyncHttpClient?