- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我打算将结构化数据写入通过 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/
我正在尝试模拟泛型我能够模拟一些泛型表达式,但我不知道如何模拟泛型初始化 最佳答案 Java 中的泛型是使用删除实现的编译器技巧(可以选择一些运行时工件,这是真的)。因此 HttpEntity 并没有
我想创建一个带有我传递的类类型的 HttpEntity。我正在尝试做如下的事情: private HttpEntity createRequestEntity(String
我的rest api使用带有2个对象参数的POST请求:自定义类型和long 我可以将一个参数链接到正文,如下所示: private void createCaseParticipant(long c
我的 Android 应用程序上有一个忘记密码的页面。如果我没有输入电子邮件,它会从服务器返回正确的响应,如果我输入的电子邮件是在我们的数据库中找到的,那么它会向用户发送一封电子邮件并从服务器返回正确
我正在使用版本 4.3.3 的 Apache HttpClient API。当我执行以下语句时,它返回 HttpResponse 实例。 HttpResonse response = httpClie
嗨,我正在尝试使用 post 方法使用 apatche 4.0.1 in this example但我得到了 HttpEntity ClassNotFound 异常 最佳答案 您不正确地将 httpc
我正在尝试更新到 com.loopj.android:android-async-http 的最新版本 (1.4.9),其中 org.apache.http替换为 cz.msebera.android
我正在尝试运行 documentation 中的简单示例没有任何变化: import spray.json.DefaultJsonProtocol import spray.httpx.unmarsh
我有一个带有 HttpEntity 的 HttpResponse(全部来自 org.apache.http)。 我的 HttpEntity 有一些 application/json 内容,我想在转发之
这个问题已经有答案了: What exactly is an HTTP Entity? (11 个回答) 已关闭 7 年前。 我已经阅读了有关 HttpEntity 的 spring 文档。因此,它代
我正在尝试使用 jakarta commons HttpClient 库。 我想我在这里很蠢,但我不知道如何将完整的 HttpEntity 写入文件。 我正在尝试: FileOutputStream
我正在使用 apache httpclient (4.x) 为我的 REST web 服务编写一个 REST 客户端。我正在使用 JAXB (JSON) 进行请求/响应。在我的一个网络服务中,我有一个
在 android API 7+ 中有什么方法可以报告对 HttpEntity.getContent() 的调用进度? 在我的例子中,我在响应流中获取图像,因此传输可能需要相当长的时间。我想要一个样式
我正在尝试使用 this 学习 XML 解析教程,但有些类(class)没有被导入。这是代码: public String getXmlFromUrl(String url) { String
我有以下代码: HttpClient FETCHER HttpResponse response = FETCHER.execute(host, httpMethod); 我正在尝试将其内容读取为这样
我正在做一个小应用程序,它接收一些带有 UTF-8 编码的 XML,浏览器中完全相同的 XML 正确呈现字符,而在 Android 中我有一些“垃圾”,例如。 WÅochy 而不是 Włochy 或
我想执行带有主体的 HTTP DELETE 请求。我正在使用 Spring 框架。 为此,我必须进行以下修改: RestTemplate _deleteManager; _deleteManager
我遇到过 EntityUtils.consume(httpEntity);,但我不确定它的真正作用。 例如: try { //... some code HttpEntity http
我正在使用 akka.http.scaladsl.model.HttpResponse、HttpEntity。 得到 response 后,它是格式的 responseEntity 类型 (Conte
我有以下 Java 代码: HttpResponse response = httpClient.execute(request); HttpEntity entity = response.getE
我是一名优秀的程序员,十分优秀!