java - 在知道其大小之前发送请求内容的 HTTP (org.apache.http)

标签 java http

我想在创建整个数据之前开始将数据发送到 HTTP 服务器。

当您使用 java.net.HttpURLConnection 时,这非常容易:

urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);

dos = new DataOutputStream(urlConnection.getOutputStream());
...
dos.writeShort(s);
...

但由于某些原因,我想使用 org.apache.http 包来做到这一点(我必须开发一个基于包 org.apache.http 的库)。我已阅读其文档,但没有找到与上面代码类似的内容。在知道最终数据大小之前,是否可以使用 org.apache.http 包将数据分块发送到 HTTP 服务器?

提前感谢所有建议;)

最佳答案

使用 Apache 库以 block 形式发送不知道其最终大小的数据也很容易。这是一个简单的例子:

DataInputStream dis;
...
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://localhost:8080");

BasicHttpEntity entity = new BasicHttpEntity();
entity.setChunked(true);
entity.setContentLength(-1);
entity.setContent(dis);

httppost.setEntity(entity);
HttpResponse response = null;
try {
     response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
    // TODO
} catch (IOException e) {
    // TODO
}
...
// processing http response....

dis 是一个应包含实体主体的流。您可以使用管道流将 dis 输入流与输出流进行管道连接。因此,一个线程可能正在创建数据(例如从麦克风录制声音),而另一个线程可能会将其发送到服务器。

// creating piped streams
private PipedInputStream pis;
private PipedOutputStream pos;
private DataOutputStream dos;
private DataInputStream dis;

...

pos = new PipedOutputStream();
pis = new PipedInputStream(pos);
dos = new DataOutputStream(pos);
dis = new DataInputStream(pis);

// in thread creating data dynamically
try {
    // writing data to dos stream
    ...
    dos.write(b);
    ...
} catch (IOException e) {
    // TODO
}

// Before finishing thread, we have to flush and close dos stream
// then dis stream will know that all data have been written and will finish
// streaming data to server.
try {
    dos.flush();
    dos.close();
} catch (Exception e) {
    // TODO
}

dos 应传递给动态创建数据的线程,dis 传递给向服务器发送数据的线程。

另请参阅:http://www.androidadb.com/class/ba/BasicHttpEntity.html

关于java - 在知道其大小之前发送请求内容的 HTTP (org.apache.http),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12260837/

相关文章:

java - 使用 Mockito,如果我使用 @InjectMocks 将一个对象注入(inject)到我的模拟中,如何避免清空其他对象?

java - Android ComputableFuture 无法与 Firestore 配合使用

java - 使用synchronized关键字和join()的输出差异

java - 里面的类型转换类型 Optional

http - flutter x-www-form-urlencoded POST 请求

c# - .net webclient 返回 500 错误,但浏览器中的 url 没问题

java - 在网站中启动小程序

javascript - Express 在 6 次请求后不再接受邮寄请求

asp.net-mvc - 当页面依赖于 session 时,处理永久链接的正确方法是什么?

google-chrome - 如何在 chrome 或 chromium 中禁用 HTTP/2?