gpt4 book ai didi

java - 我可以跳过实现 HttpEntity#getContent() 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:32 26 4
gpt4 key购买 nike

我打算将结构化数据写入通过 HTTP 客户端访问的资源。用于执行此操作的 API(对于 JSON、YAML、XML)往往会让我向它们传递一个 OutputStream,它们将写入该输出流 - 它们不会给我一个 InputStream

无论好坏,这里使用的客户端都是 Apache HTTP 组件 HttpClient。 (我们使用的其他库依赖于它。在大多数情况下,它并不完全是坏事,至少不会迫使我们采用奇怪的线程本地黑客技术来获得正常的行为,这与 java.net.URL 不同。)

发出请求时,HttpEntityEnlookingRequestBase(在 HttpClient 中)强制我设置 HttpEntity 以将任何数据发送到服务器。 HttpEntity 似乎迫使我实现 getContent(),返回一个 InputStream

我没有 InputStream,因此我被迫在两种解决方法之间进行选择:

A) 将所有数据序列化到内存中的字节数组中,然后再次将其全部流式输出。我不想这样做,因为通常情况下,数据的序列化形式比数据本身占用更多的内存,并且在某些情况下我们甚至一开始就没有它在内存中,所以这会带来麻烦。

B) 创建一个管道。启动第二个线程以将对象写入管道的 OutputStream 端。返回InputStream 结束。这实际上无法在 HttpEntity 本身中完成,因为 HttpEntity 不知道何时不再需要数据流。 (它可以做出有根据的猜测,当您到达流的末尾时,它就完成了,但是如果与服务器的连接中途断开,您将使管道永远打开。)这意味着我最终将解决方法移动到建立连接的每个地方,这是大量的结构重复。

这些解决方法都不是很好,但我猜 (B) 是“更少的狗屎”,因为它至少不会在传输大对象时使整个应用程序崩溃。

据我所知:

public class WriteLogicEntity extends AbstractHttpEntity {
private final WriteLogic writeLogic;

public InputStreamEntity(WriteLogic writeLogic) {
this(instream, null);
}

public InputStreamEntity(WriteLogic writeLogic,
ContentType contentType) {
this.writeLogic = writeLogic;
if(contentType != null) {
this.setContentType(contentType.toString());
}
}

@Override
public boolean isRepeatable() {
// We could enforce that all WriteLogic be repeatable
// or add a similar method there, but at least for now,
// assuming it isn't repeatable is safe.
return false;
}

@Override
public long getContentLength() {
// We really don't know.
return -1L;
}

@Override
public InputStream getContent() throws IOException {
//TODO: What do we do here?
}

@Override
public void writeTo(OutputStream outstream) throws IOException {
writeLogic.withOutputStream(outstream);
}

@Override
public boolean isStreaming() {
return true; //TODO: Verify this choice
}
}

public interface WriteLogic {
void withOutputStream(OutputStream stream) throws IOException;
}

现在我想知道 getContent() 是否可以抛出 UnsupportedOperationException。当然,在发出请求时,他们无论如何都会使用 writeTo() ,对吗?嗯,我想不通。即使它在一个实验中有效,也不能向我保证某种请求不可能要求调用 getContent()

所以我想知道是否有比我更了解这个库的人可以调用它 - 跳过实现这个方法是否安全?

(这个 getContent() 方法似乎不应该出现在 API 中。或者应该将其记录下来,至少允许我以某种方式实现它。无论如何,我打算提交一个有关它的错误,因为当您尝试编写请求时,被迫提供 InputStream 非常不方便。)

最佳答案

如果实体内容无法表示为 InputStream getContent 方法可能会抛出 UnsupportedOperationException。 HttpClient 在内部使用 writeTo 将实体内容流式传输到底层 HTTP 连接。

关于java - 我可以跳过实现 HttpEntity#getContent() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270670/

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