相比于HttpClient 之前的版本,HttpClient 4.2 提供了一組基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 為了方便使用,F(xiàn)luent API只暴露了一些最基本的HttpClient功能。這樣,F(xiàn)luent API就將開發(fā)者從連接管理、資源釋放等繁雜的操作中解
相比于HttpClient 之前的版本,HttpClient 4.2 提供了一組基于流接口(fluent interface)概念的更易使用的API,即Fluent API.
為了方便使用,F(xiàn)luent API只暴露了一些最基本的HttpClient功能。這樣,F(xiàn)luent API就將開發(fā)者從連接管理、資源釋放等繁雜的操作中解放出來,從而更易進行一些HttpClient的簡單操作。
http://blog.csdn.net/vector_yi/article/details/24298629
還是利用具體例子來說明吧。
以下是幾個使用Fluent API的代碼樣例:
一、最基本的http請求功能
執(zhí)行Get、Post請求,不對返回的響應作處理
package com.vectoryi.fluent; import java.io.File; import org.apache.http.HttpHost; import org.apache.http.HttpVersion; import org.apache.http.client.fluent.Form; import org.apache.http.client.fluent.Request; import org.apache.http.entity.ContentType; public class FluentRequests { public static void main(String[] args)throws Exception { //執(zhí)行一個GET請求,同時設置Timeout參數(shù)并將響應內(nèi)容作為String返回 Request.Get("http://blog.csdn.net/vector_yi") .connectTimeout(1000) .socketTimeout(1000) .execute().returnContent().asString(); //以Http/1.1版本協(xié)議執(zhí)行一個POST請求,同時配置Expect-continue handshake達到性能調(diào)優(yōu), //請求中包含String類型的請求體并將響應內(nèi)容作為byte[]返回 Request.Post("http://blog.csdn.net/vector_yi") .useExpectContinue() .version(HttpVersion.HTTP_1_1) .bodyString("Important stuff", ContentType.DEFAULT_TEXT) .execute().returnContent().asBytes(); //通過代理執(zhí)行一個POST請求并添加一個自定義的頭部屬性,請求包含一個HTML表單類型的請求體 //將返回的響應內(nèi)容存入文件 Request.Post("http://blog.csdn.net/vector_yi") .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")); } }
package com.vectoryi.fluent; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.apache.http.client.fluent.Async; import org.apache.http.client.fluent.Content; import org.apache.http.client.fluent.Request; import org.apache.http.concurrent.FutureCallback; public class FluentAsync { public static void main(String[] args)throws Exception { // 利用線程池 ExecutorService threadpool = Executors.newFixedThreadPool(2); Async async = Async.newInstance().use(threadpool); Request[] requests = new Request[] { Request.Get("http://www.google.com/"), Request.Get("http://www.yahoo.com/"), Request.Get("http://www.apache.com/"), Request.Get("http://www.apple.com/") }; Queue> queue = new LinkedList >(); // 異步執(zhí)行GET請求 for (final Request request: requests) { Future future = async.execute(request, new FutureCallback () { public void failed(final Exception ex) { System.out.println(ex.getMessage() + ": " + request); } public void completed(final Content content) { System.out.println("Request completed: " + request); } public void cancelled() { } }); queue.add(future); } while(!queue.isEmpty()) { Future future = queue.remove(); try { future.get(); } catch (ExecutionException ex) { } } System.out.println("Done"); threadpool.shutdown(); } }
package com.vectoryi.fluent; import org.apache.http.client.fluent.Form; import org.apache.http.client.fluent.Request; public class FluentQuickStart { public static void main(String[] args) throws Exception { Request.Get("http://targethost/homepage") .execute().returnContent(); Request.Post("http://targethost/login") .bodyForm(Form.form().add("username", "vip").add("password", "secret").build()) .execute().returnContent(); } }
在本例中是利用xmlparsers來解析返回的ContentType.APPLICATION_XML類型的內(nèi)容。
package com.vectoryi.fluent; 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.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; 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.Request; import org.apache.http.entity.ContentType; import org.w3c.dom.Document; import org.xml.sax.SAXException; public class FluentResponseHandling { public static void main(String[] args)throws Exception { Document result = Request.Get("http://www.baidu.com") .execute().handleResponse(new ResponseHandler() { public Document handleResponse(final HttpResponse response) throws 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.getOrDefault(entity); if (!contentType.equals(ContentType.APPLICATION_XML)) { throw new ClientProtocolException("Unexpected content type:" + contentType); } Charset charset = contentType.getCharset(); if (charset == null) { charset = Consts.ISO_8859_1; } return docBuilder.parse(entity.getContent(), charset.name()); } catch (ParserConfigurationException ex) { throw new IllegalStateException(ex); } catch (SAXException ex) { throw new ClientProtocolException("Malformed XML document", ex); } } }); // 處理得到的result System.out.println(result); } }
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com