HttpEntity的类型及其使用

HttpEntity的类型及其使用一HttpEntity的类型 1  BasicHttpEntity     代表底层流的基本实体。通常是在http报文中获取的实体。他只有一个空参的构造方法。刚创建时没有内容,长度为负值。需要通过两个方法,把值赋进去。/***BasicHttpEntity*@throwsIOException*/publicstaticvoidtes

 

一 HttpEntity的类型

 

1  BasicHttpEntity

      代表底层流的基本实体。通常是在http报文中获取的实体。他只有一个空参的构造方法。刚创建时没有内容,长度为负值。需要通过两个方法,把值赋进去。

/**
  * BasicHttpEntity
  * @throws IOException
  */
 public static void testBasicHttpEntity() throws IOException{
  InputStream is = null;
  //BasicHttpEntity这类就是一个输入流的内容包装类,包装内容的相关的编码格式,长度等
  BasicHttpEntity entity = new BasicHttpEntity();
  //设置内容
  entity.setContent(is);
  //设置长度
  entity.setContentLength(is.available());
  //没搞懂chunked这个属性啥意思
  entity.setChunked(false);
 }
只听到从架构师办公室传来架构君的声音:
游莫逐炎洲翠,栖莫近吴宫燕。有谁来对上联或下联?

2  ByteArrayEntity

    是自我包含的,可重复获得使用的,从指定的字节数组中取出内容的实体。字节数组是这个实体的构造方法的参数。

此代码由Java架构师必看网-架构君整理
/** * ByteArrayEntity * @throws IOException */ public static void testByteArrayEntity() throws IOException{ ByteArrayEntity entity = new ByteArrayEntity("内容".getBytes()); ByteArrayInputStream is = (ByteArrayInputStream) entity.getContent(); //上面这行代码返回的其实是一个ByteArrayInputStream对象 /*public InputStream getContent() { return new ByteArrayInputStream(this.b, this.off, this.len); }*/ }

3  StringEntity

    是自我包含的可重复的实体。通过String创建的实体。有两个构造方法,一个是自Sring为参数的构造方法,一个是以String和字符编码为参数的构造方法。

/**
  * StringEntity
  * @throws IOException
  */
 public static void testStringEntity() throws IOException{
   StringBuilder sb = new StringBuilder();
   //获取系统的信息集合,这个集合是不可以修改的
   Map<String, String> nev = System.getenv();
   for(Entry<String, String> entry : nev.entrySet()){
    sb.append(entry.getKey()).append("=")
    .append(entry.getValue()).append("\n");
   }
   String content = sb.toString();
   System.out.println(content);
   //创建只带字符串参数的
   StringEntity entity = new StringEntity(content);
   //创建带字符创参数和字符编码的
   StringEntity entity2 = new StringEntity(content, "UTF-8");
   
 }

4  InputreamEntity

    是流式不可以重复的实体。构造方法是InputStream 和内容长度,内容长度是输入流的长度。

此代码由Java架构师必看网-架构君整理
/** * InputStreamEntity * @throws IOException */ public static void testInputStreamEntity() throws IOException{ InputStream is = null; //InputStreamEntity严格是对内容和长度相匹配的。用法和BasicHttpEntity类似 InputStreamEntity entity = new InputStreamEntity(is, is.available()); }

5  FileEntity

    自我包含式,可以重复的实体。参数传入文件和文件类型。

/**
  * FileEntity
  * @throws IOException
  */
 public static void testFileEntity() throws IOException{
   FileEntity entity = new FileEntity(new File(""), ContentType.APPLICATION_FORM_URLENCODED);
   FileEntity entity2 = new FileEntity(new File(""), "application/java-achive");
   
 }

6  EntityTemplete

    从ContentProducer接口接受内容的实体。在ContentProducer的实现类中写入想要写入的内容。

/**
  * EntityTemplate
  * @throws IOException
  */
 public static void testEntityTemplate() throws IOException{
  ContentProducer producer = new ContentProducer() {
   
   @Override
   public void writeTo(OutputStream outstream) throws IOException {
    outstream.write("这是什么东东》。".getBytes());
   }
  };
  
  EntityTemplate entity = new EntityTemplate(producer);
  entity.writeTo(System.out);
 }

7  HttpEntityWrapper

      这个是创建被包装实体的基类,有被包装实体的引用。相当于实体的代理类,被包装实体是他的一个属性。下面是这个类的源码:

/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package org.apache.http.entity;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.annotation.NotThreadSafe;

/**
 * Base class for wrapping entities.
 * Keeps a {@link #wrappedEntity wrappedEntity} and delegates all
 * calls to it. Implementations of wrapping entities can derive
 * from this class and need to override only those methods that
 * should not be delegated to the wrapped entity.
 *
 * @since 4.0
 */
@NotThreadSafe
public class HttpEntityWrapper implements HttpEntity {

    /** The wrapped entity. */
    protected HttpEntity wrappedEntity;

    /**
     * Creates a new entity wrapper.
     *
     * @param wrapped   the entity to wrap, not null
     * @throws IllegalArgumentException if wrapped is null
     */
    public HttpEntityWrapper(HttpEntity wrapped) {
        super();

        if (wrapped == null) {
            throw new IllegalArgumentException
                ("wrapped entity must not be null");
        }
        wrappedEntity = wrapped;

    } // constructor


    public boolean isRepeatable() {
        return wrappedEntity.isRepeatable();
    }

    public boolean isChunked() {
        return wrappedEntity.isChunked();
    }

    public long getContentLength() {
        return wrappedEntity.getContentLength();
    }

    public Header getContentType() {
        return wrappedEntity.getContentType();
    }

    public Header getContentEncoding() {
        return wrappedEntity.getContentEncoding();
    }

    public InputStream getContent()
        throws IOException {
        return wrappedEntity.getContent();
    }

    public void writeTo(OutputStream outstream)
        throws IOException {
        wrappedEntity.writeTo(outstream);
    }

    public boolean isStreaming() {
        return wrappedEntity.isStreaming();
    }

    /**
     * @deprecated (4.1) Either use {@link #getContent()} and call {@link java.io.InputStream#close()} on that;
     * otherwise call {@link #writeTo(OutputStream)} which is required to free the resources.
     */
    @Deprecated
    public void consumeContent() throws IOException {
        wrappedEntity.consumeContent();
    }

}

8  BufferedHttpEntity

    是HttpEntityWarpper的子类,可以把不可以重复的实体,实现成可以重复的实体。它从提供的实体中读取内容,缓存到内容中。源码如下:

/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package org.apache.http.entity;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpEntity;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.EntityUtils;

/**
 * A wrapping entity that buffers it content if necessary.
 * The buffered entity is always repeatable.
 * If the wrapped entity is repeatable itself, calls are passed through.
 * If the wrapped entity is not repeatable, the content is read into a
 * buffer once and provided from there as often as required.
 *
 * @since 4.0
 */
@NotThreadSafe
public class BufferedHttpEntity extends HttpEntityWrapper {

    private final byte[] buffer;

    /**
     * Creates a new buffered entity wrapper.
     *
     * @param entity   the entity to wrap, not null
     * @throws IllegalArgumentException if wrapped is null
     */
    public BufferedHttpEntity(final HttpEntity entity) throws IOException {
        super(entity);
        if (!entity.isRepeatable() || entity.getContentLength() < 0) {
            this.buffer = EntityUtils.toByteArray(entity);
        } else {
            this.buffer = null;
        }
    }

    @Override
    public long getContentLength() {
        if (this.buffer != null) {
            return this.buffer.length;
        } else {
            return wrappedEntity.getContentLength();
        }
    }

    @Override
    public InputStream getContent() throws IOException {
        if (this.buffer != null) {
            return new ByteArrayInputStream(this.buffer);
        } else {
            return wrappedEntity.getContent();
        }
    }

    /**
     * Tells that this entity does not have to be chunked.
     *
     * @return  <code>false</code>
     */
    @Override
    public boolean isChunked() {
        return (buffer == null) && wrappedEntity.isChunked();
    }

    /**
     * Tells that this entity is repeatable.
     *
     * @return  <code>true</code>
     */
    @Override
    public boolean isRepeatable() {
        return true;
    }


    @Override
    public void writeTo(final OutputStream outstream) throws IOException {
        if (outstream == null) {
            throw new IllegalArgumentException("Output stream may not be null");
        }
        if (this.buffer != null) {
            outstream.write(this.buffer);
        } else {
            wrappedEntity.writeTo(outstream);
        }
    }


    // non-javadoc, see interface HttpEntity
    @Override
    public boolean isStreaming() {
        return (buffer == null) && wrappedEntity.isStreaming();
    }

} // class BufferedHttpEntity

二 HttpEntity 的使用

 

1  HttpEntity实体即可以使流也可以使字符串形式。具体有什么用法看他的方法解释:

package com.scl.base;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;

public class HttpClientDemo06 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			HttpEntity entity = new StringEntity("这一个字符串实体", "UTF-8");
			//内容类型
			System.out.println(entity.getContentType());
			//内容的编码格式
			System.out.println(entity.getContentEncoding());
			//内容的长度
			System.out.println(entity.getContentLength());
			//把内容转成字符串
			System.out.println(EntityUtils.toString(entity));
			//内容转成字节数组
			System.out.println(EntityUtils.toByteArray(entity).length);
			//还有个直接获得流
			//entity.getContent();
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		} catch (ParseException e) {
		} catch (IOException e) {
		}

	}

}

2  对于实体的资源使用完之后要适当的回收资源,特别是对于流实体。例子代码如下:

public static void test() throws IllegalStateException, IOException{
		HttpResponse response = null;
		HttpEntity entity = response.getEntity();

		if(entity!=null){

				InputStream is = entity.getContent();
				try{
					//做一些操作
				}finally{
					//最后别忘了关闭应该关闭的资源,适当的释放资源
					if(is != null){
						is.close();
					}
					//这个方法也可以把底层的流给关闭了
					EntityUtils.consume(entity);
					//下面是这方法的源码
					/*public static void consume(final HttpEntity entity) throws IOException {
				        if (entity == null) {
				            return;
				        }
				        if (entity.isStreaming()) {
				            InputStream instream = entity.getContent();
				            if (instream != null) {
				                instream.close();
				            }
				        }
				    }*/
				}

		}

 

FROM: http://blog.csdn.net/athenamax/article/details/8185043http://blog.csdn.net/athenamax/article/details/8185041

原文字体太小,看着眼睛疼,特此加大字体转载

本文来源nefetaria,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/212009
0
   

发表评论