HttpClient4.2 Fluent API学习

 相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API.

            为了方便使用,Fluent API只暴露了一些最基本的HttpClient功能。这样,Fluent API就将开发者从连接管理、资源释放等繁杂的操作中解放出来,从而更易进行一些HttpClient的简单操作。

(原文地址: http://blog.csdn.net/vector_yi/article/details/24298629 转载请注明出处)

            还是利用具体例子来说明吧。 

以下是几个使用Fluent API的代码样例:

一、最基本的http请求功能

执行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 {
        //执行一个GET请求,同时设置Timeout参数并将响应内容作为String返回
  Request.Get("http://blog.csdn.net/vector_yi")
    .connectTimeout(1000)
    .socketTimeout(1000)
    .execute().returnContent().asString();

  //以Http/1.1版本协议执行一个POST请求,同时配置Expect-continue handshake达到性能调优,
  //请求中包含String类型的请求体并将响应内容作为byte[]返回
  Request.Post("http://blog.csdn.net/vector_yi")
    .useExpectContinue()
    .version(HttpVersion.HTTP_1_1)
    .bodyString("Important stuff", ContentType.DEFAULT_TEXT)
    .execute().returnContent().asBytes();


  //通过代理执行一个POST请求并添加一个自定义的头部属性,请求包含一个HTML表单类型的请求体
  //将返回的响应内容存入文件
  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<Future<Content>> queue = new LinkedList<Future<Content>>();
    // 异步执行GET请求
    for (final Request request: requests) {
      Future<Content> future = async.execute(request, new FutureCallback<Content>() {

        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<Content> 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();
  }
}
四、处理Response
在本例中是利用xmlparsers来解析返回的ContentType.APPLICATION_XML类型的内容。

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<Document>() {

      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);
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值