Http Client Examples:Custom protocol interceptors

5612 ワード

公式ホームページ:http://hc.apache.org/
 
Components
HttpCore Http Client Custom protocol interceptors
This example shows the use of protocol interceptors to transparently modify properties of HTTP messages sent/received by the HTTP client.
In this particular case HTTP client is made capable of trnsparent content GZIP copressisision by adding two protocol interceptors:a request interterceptor aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapapapapapapapapapapapapapapapapapapapapapapareret contet contet contet t contetetetetentntt t t contetetetetetetetetetetetet t GZininininininininininininininininininessing decorator class.The use of protocol interceptors makes content comment compresion complectely transparent to the consumer of the Http Client interface.
 
カスタムブロックプロトコル
 
この例は、修正属性のHTTPメールを介して送受信されるHTTPクライアントをプロトコルでブロックすることを示している。
 
このような特定の場合のHTTPクライアントは、コンテンツgzipを通じて圧縮された2つの議定書ブロックを追加することができます。ブロックを要求して、「エンコーディングを受け入れる:gzipまたは'ヘッダのいずれかのオフラインの要求と反応を追加しました。圧縮応答のこれらのエンティティのパッケージとuncomppressingの装飾類を自動的にブロックすることができます。協議で遮断し、完全に透明なコンテンツを消費者のHttpClientインターフェースに圧縮させる。
 
package cn.lake.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;

import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.HttpEntityWrapper;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

/**
 * Demonstration of the use of protocol interceptors to transparently 
 * modify properties of HTTP messages sent / received by the HTTP client.
 * <p/>
 * In this particular case HTTP client is made capable of transparent content 
 * GZIP compression by adding two protocol interceptors: a request interceptor
 * that adds 'Accept-Encoding: gzip' header to all outgoing requests and
 * a response interceptor that automatically expands compressed response
 * entities by wrapping them with a uncompressing decorator class. The use of
 * protocol interceptors makes content compression completely transparent to 
 * the consumer of the {@link org.apache.http.client.HttpClient HttpClient}
 * interface.
 */
public class ClientGZipContentCompression {

	public final static void main(String[] args) throws Exception {
		DefaultHttpClient httpclient = new DefaultHttpClient();

		httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

			public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
				if (!request.containsHeader("Accept-Encoding")) {
					request.addHeader("Accept-Encoding", "gzip");
				}
			}

		});

		httpclient.addResponseInterceptor(new HttpResponseInterceptor() {

			public void process(final HttpResponse response, final HttpContext context) throws HttpException,
					IOException {
				HttpEntity entity = response.getEntity();
				Header ceheader = entity.getContentEncoding();
				if (ceheader != null) {
					HeaderElement[] codecs = ceheader.getElements();
					for (int i = 0; i < codecs.length; i++) {
						if (codecs[i].getName().equalsIgnoreCase("gzip")) {
							response.setEntity(new GzipDecompressingEntity(response.getEntity()));
							return;
						}
					}
				}
			}

		});

		HttpGet httpget = new HttpGet("http://www.apache.org/");

		// Execute HTTP request
		System.out.println("executing request " + httpget.getURI());
		HttpResponse response = httpclient.execute(httpget);

		System.out.println("----------------------------------------");
		System.out.println(response.getStatusLine());
		System.out.println(response.getLastHeader("Content-Encoding"));
		System.out.println(response.getLastHeader("Content-Length"));
		System.out.println("----------------------------------------");

		HttpEntity entity = response.getEntity();

		if (entity != null) {
			String content = EntityUtils.toString(entity);
			System.out.println(content);
			System.out.println("----------------------------------------");
			System.out.println("Uncompressed size: " + content.length());
		}
	}

	static class GzipDecompressingEntity extends HttpEntityWrapper {

		public GzipDecompressingEntity(final HttpEntity entity) {
			super(entity);
		}

		@Override
		public InputStream getContent() throws IOException, IllegalStateException {

			// the wrapped entity's getContent() decides about repeatability
			InputStream wrappedin = wrappedEntity.getContent();

			return new GZIPInputStream(wrappedin);
		}

		@Override
		public long getContentLength() {
			// length of ungzipped content is not known
			return -1;
		}

	}

}
 
翻訳がよくないです。ご了承ください。