创建实体
有多种创建实体的方式,HttpCore提供一下几种实体的实现:
1.1.4.1 BasicHttpEntity
和类名指出的一样,基础实体代表一个数据流。总的来说,应该使用这个类代表从HTTP报文中接收的实体。
这个实体类只有一个空构造函数。在创建实例之后,这个实体没有内容,内容长度为负。
需要手动设置内容,内容长度是否设置可选。可以通过BasicHttpEntity#setContent(InputStream)
和BasicHttpEntity#setContentLength(long)
来分别设置。
BasicHttpEntity myEntity = new BasicHttpEntity();
myEntity.setContent(someInputStream);
myEntity.setContentLength(340); // sets the length to 340
1.1.4.2 ByteArrayEntity
ByteArrayEntity
是一种自我包含的,可重复的实体,从一个指定的字节数组中获取内容。创建时需要为构造函数提供一个字节数组。
ByteArrayEntity myEntity = new ByteArrayEntity(new byte[] {1,2,3}, ContentType.APPLICATION_OCTET_STREAM);
1.1.4.3 StringEntity
StringEntity
是一种自我包含的,可重复的实体,从String对象中获取内容。这个类有三种构造函数,一种通过String对象创建,一种通过指定字符编码和String对象创建,还有一种允许指定mime类型。
注:以上为原文翻译,源代码中有四种构造函数
public StringEntity(String string, ContentType contentType)
public StringEntity(String string, String charset)
public StringEntity(String string, Charset charset)
public StringEntity(String string)
StringBuilder sb = new StringBuilder();
Map<String, String> env = System.getenv();
for (Map.Entry<String, String> envEntry : env.entrySet()) {
sb.append(envEntry.getKey()).append(": ").append(envEntry.getValue()).append("\r\n");
}
// construct without a character encoding (defaults to ISO-8859-1)
HttpEntity myEntity1 = new StringEntity(sb.toString());
// alternatively construct with an encoding (mime type defaults to "text/plain")
HttpEntity myEntity2 = new StringEntity(sb.toString(), Consts.UTF_8);
// alternatively construct with an encoding and a mime type
HttpEntity myEntity3 = new StringEntity(sb.toString(), ContentType.create("text/plain", Consts.UTF_8));
1.1.4.4 InputStreamEntity
InputStreamEntity
是一种数据流式的,不可重复的实体,从一个输入流中获取内容。创建实例时需要提供输入流和内容长度,实例会通过内容长度限制从输入流中读取的数据量。如果长度和输入流中的数据长度相等,数据将被发送。如果提供内容长度为负数,则会读取输入流中的所有数据,这和提供一个准确的内容长度是等效的,所以应该提供内容长度限制读取的数据量。
InputStream instream = getSomeInputStream();
InputStreamEntity myEntity = new InputStreamEntity(instream, 16);
1.1.4.5 FileEntity
FileEntity
是一种自我包含的,可重复的实体,从文件中获取内容。通常被用于读取不同类型的大文件,需要提供文件类型。例如,发送一个zip文件需要声明内容类型为application/zip
,XML文件需要声明类型为application/xml
HttpEntity entity = new FileEntity(staticFile, ContentType.create("application/java-archive"));
1.1.4.6 HttpEntityWrapper
这个类是创建包装实体的基础类。包装实体持有被包装实体的引用,并代理所有对被包装实体的调用。包装实体的实现可以从这个类继承,只需要覆盖不应该由被包装实体实现的方法。
1.1.4.7 BufferedHttpEntity
BufferedHttpEntity
是HttpEntityWrapper
的一个子类。创建实例时需要提供一个实体,从提供的实体中读取内容,并暂存在内存中。
这个类实现了由一个不可重复实体创建可重复实体。如果提供的实体本身可以重复,对BufferedHttpEntity
实例的调用将直接调用提供的实体。
myNonRepeatableEntity.setContent(someInputStream);
BufferedHttpEntity myBufferedEntity = new BufferedHttpEntity(myNonRepeatableEntity);