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