gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:04:11 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com