关于从HttpEntity中多次读取数据
官方教程说法:有些情况下,我们希望可以重复读取Http实体的内容。这就需要把Http实体内容缓存在内存或者磁盘上。最简单的方法就是把Http Entity转化成BufferedHttpEntity
,这样就把原Http实体的内容缓冲到了内存中。后面我们就可以重复读取BufferedHttpEntity中的内容。
package com;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class TestConnection {
public static void main(String[] args) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://www.baidu.com/");
CloseableHttpResponse response = null;
try {
try {
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
// 实体进行缓冲,可重复使用
entity = new BufferedHttpEntity(entity);
FileOutputStream out = new FileOutputStream("f1.html");
entity.writeTo(out);
out.close();
System.out.println("读第二次!");
FileOutputStream out2 = new FileOutputStream("f2.html");
entity.writeTo(out2);
out2.close();
}
} finally {
response.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行以上代码成功输出读取第二次,并生成f1,f2文件
将以下行注释掉重新测试
entity = new BufferedHttpEntity(entity);
输出报错提示Steam is closed,只能读取一次
模拟文件表单上传:基于httpclient4.5
HTTP1.1协议规定: multipart/form-data"类型已经被特别地定义用来处理Post请求方法传送的窗体数据,这在RFC 1867[15]里定义。
package com;
import java.io.File;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class TestConnection {
public static void main(String[] args) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpget = new HttpPost("http://localhost:8280/upload.do");
File file = new File("C:/Users/username/Desktop/up/up.txt");
System.out.println(file.exists());
//构建Multipart实体
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
HttpEntity fe = builder.addBinaryBody("file", file).build();
httpget.setEntity(fe);
CloseableHttpResponse response = null;
try {
try {
System.out.println("executing request " + httpget.getRequestLine());
response = httpclient.execute(httpget);
} finally {
response.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}