当前位置: 首页 > news >正文

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

}



相关文章:

  • 第二天
  • HCNA
  • AR 与 AI 技术是如何让勇士重回王者的?
  • for循环结构break和continue的用法和区别
  • Java中的关键字
  • JSON.parse()在火狐中的BUG
  • IBM:我们不会放弃XIV存储阵列
  • 客户端数据存储----Cookie From 《高程3》
  • Hadoop2.6下安装Hive
  • Windows 10份额稳步上升 Win7继续下滑
  • 初识Rust语言的所有权概念
  • 《SEO的艺术(原书第2版)》——3.1 SEO从业者所能完成的策略性目标
  • 警告:未来互联网安全动荡
  • 《人民日报》教你如何正确使用路由器
  • 窥探“大数据”全貌(技术篇、产业篇、企业转型篇)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【面试系列】之二:关于js原型
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • C++类的相互关联
  • Cumulo 的 ClojureScript 模块已经成型
  • iOS 颜色设置看我就够了
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java 内存分配及垃圾回收机制初探
  • Java程序员幽默爆笑锦集
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JSONP原理
  • JS变量作用域
  • LeetCode29.两数相除 JavaScript
  • Mithril.js 入门介绍
  • Nodejs和JavaWeb协助开发
  • session共享问题解决方案
  • vue:响应原理
  • 飞驰在Mesos的涡轮引擎上
  • 简单实现一个textarea自适应高度
  • 强力优化Rancher k8s中国区的使用体验
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • # Java NIO(一)FileChannel
  • $forceUpdate()函数
  • (13):Silverlight 2 数据与通信之WebRequest
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET 回调、接口回调、 委托
  • .NET 依赖注入和配置系统
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/C# 使用反射注册事件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6 webapi log4net完整配置使用流程
  • .net和php怎么连接,php和apache之间如何连接