httpclient 4.5.1---流式API使用

package com.cycore.dbs.common.demo.hc;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.fluent.Executor;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;
import org.apache.http.entity.ContentType;
import org.apache.http.protocol.HTTP;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class HcFluentApiDemo {

	/**
	 * Fluent API(流接口):HttpClient基于流接口概念提供了更易使用的正面API。
	 * 流接口将用户不得不处理连接管理和资源重分配的繁琐中解放出来。 
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	public void m1() throws ClientProtocolException, IOException{
		//Execute a GET with timeout settings and return response content as String
		Request.Get("http://somehost/")
			.connectTimeout(1000)
			.socketTimeout(1000)
			.execute().returnContent().asString();
	}
	
	public void m2() throws ClientProtocolException, IOException{
		//Execute a POST with the "expect-continue" handshake, using HTTP/1.1,
		//continuing a request body as String and return response content as byte array.
		Request.Post("http://somehost/do-stuff")
			.useExpectContinue()
			.version(HttpVersion.HTTP_1_1)
			.bodyString("Important stuff", ContentType.DEFAULT_TEXT)
			.execute().returnContent().asBytes();
	}
	
	public void m3() throws ClientProtocolException, IOException{
		//Execute a POST with a custom header through the proxy containing a request body
		//as an HTML form and save the result to the file
		Request.Post("http://somehost/some-form")
			.addHeader("X-Custom-header", "stuff")
			.viaProxy(new HttpHost("myproxy", 8080))
			.bodyForm(Form.form().add("username", "vip").add("password", "secret").build())
			.execute().saveContent(new File("result.dump"));;
	}
	
	/**
	 * 用户也可以通过缓存和重用后续请求的认证详细信息直接使用Executor来执行特定安全上下文中的请求.
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	public void m4() throws ClientProtocolException, IOException{
		Executor executor=Executor.newInstance()
				.auth(new HttpHost("somehost"), "username", "password")
				.auth(new HttpHost("myproxy", 8080), "username", "password")
				.authPreemptive(new HttpHost("myproxy", 8080));
		
		executor.execute(Request.Get("http://somehost"))
			.returnContent().asString();
		
		executor.execute(Request.Post("http://somehost/do-stuff")
				.useExpectContinue()
				.bodyString("Important stuff", ContentType.DEFAULT_TEXT))
				.returnContent().asString();
	}
	
	/**
	 * 响应处理:在大多数情况下,使用fluent facade api会带来不得不将响应消息内容缓冲进内存的代价.
	 * 在这里极度推荐使用ResponseHandler用于HTTP响应处理以避免不得不将内容缓冲进入内存.
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	public void m5() throws IOException{
		Document result = Request.Get("http://somehost/content")
				.execute().handleResponse(new ResponseHandler<Document>() {

					public Document handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
						StatusLine statusLine = response.getStatusLine();
						HttpEntity entity = response.getEntity();
						if(statusLine.getStatusCode() >= 300){
							throw new HttpResponseException(
									statusLine.getStatusCode(), 
									statusLine.getReasonPhrase());
						}
						if(entity == null){
							throw new ClientProtocolException("Response contains no content");
						}
						DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
						
						try {
							DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
							ContentType contentType = ContentType.get(entity);
							
							if(!contentType.equals(ContentType.APPLICATION_XML)){
								throw new ClientProtocolException("Unexpected content type:"
										+contentType);
							}
							
							Charset charset = contentType.getCharset();
							if(charset == null){
								charset = HTTP.DEF_CONTENT_CHARSET;
							}
							
							return docBuilder.parse(entity.getContent());
						
						} catch (ParserConfigurationException ex) {
							throw new IllegalStateException(ex);
						} catch (SAXException ex) {
							throw new ClientProtocolException("Malformed XML document", ex);
						}
					}
				});
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}

你可能感兴趣的:(httpclient)