AsyncHttpClient 开源框架學習研究

标签: asynchttpclient 开源 框架 | 发表时间:2014-02-23 23:04 | 作者:u011176244
出处:http://blog.csdn.net

转载请注明出处: http://blog.csdn.net/krislight 

OverView:

AsyncHttpClient庫 基於Apache的HttpClient框架,是一個異步的httpClient, 所有的http請求都在子線程中,但是callback執行的線程和創建這個callback的線程是同一個(也即主線程創建的callback那麼執行的時候也是在主線程中)

基本用法:  

AsyncHttpClient client = new AsyncHttpClient();
	client.get("http://www.google.com", new AsyncHttpResponseHandler() {
	          @Override
			public void onStart() {
				super.onStart();
                    //in MainThread, you can do some ui operation here like progressBar.  
			}
			
			@Override
			public void onFinish() {
                    // no matter success or failed this method is always invoke
				super.onFinish();
			}
			
			@Override
			public void onSuccess(String content) {
                   //success
			}
			
			@Override
			public void onFailure(Throwable error, String content) {
                  //failed
			}	
});

項目中建議定義成靜態工具類:                   

public class TwitterRestClient {
		  private static final String BASE_URL = "http://api.twitter.com/1/";
		  private static AsyncHttpClient client = new AsyncHttpClient();
		  public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
		      client.get(getAbsoluteUrl(url), params, responseHandler);
		  }
		  public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
		      client.post(getAbsoluteUrl(url), params, responseHandler);
		  }
		  private static String getAbsoluteUrl(String relativeUrl) {
		      return BASE_URL + relativeUrl;
		  }
		}

使用的时候:           

class TwitterRestClientUsage {
	    public void getPublicTimeline() throws JSONException {
	        TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
	            @Override
	            public void onSuccess(JSONArray timeline) {
	                // Pull out the first event on the public timeline
	                JSONObject firstEvent = timeline.get(0);
	                String tweetText = firstEvent.getString("text");

	                // Do something with the response
	                System.out.println(tweetText);
	            }
	        });
	    }
	}

保存Server端發送的Cookie:                     

AsyncHttpClient myClient = new AsyncHttpClient();
	PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
	myClient.setCookieStore(myCookieStore);


如果想加入自己的Cookie:

 
 	BasicClientCookie newCookie = new BasicClientCookie("cookiesare", "awesome");
	newCookie.setVersion(1);
	newCookie.setDomain("mydomain.com");
	newCookie.setPath("/");
	myCookieStore.addCookie(newCookie);

帶參數的Http請求:

可以這樣構造參數:

RequestParams params = new RequestParams();
	params.put("key", "value");
	params.put("more", "data");

也可以構造單個參數:

 RequestParams params = new RequestParams("single", "value");

 還可以根據Map構造:

	HashMap<String, String> paramMap = new HashMap<String, String>();
	paramMap.put("key", "value");
	RequestParams params = new RequestParams(paramMap);

使用參數上傳文件:

1.傳入InputStream:

 
 InputStream myInputStream = blah;
RequestParams params = new RequestParams();
params.put("secret_passwords", myInputStream, "passwords.txt");

2.傳入File:

File myFile = new File("/path/to/file.png");
	RequestParams params = new RequestParams();
	try {
	    params.put("profile_picture", myFile);
	} catch(FileNotFoundException e) {}

3.傳入Byte數組:

	byte[] myByteArray = blah;
	RequestParams params = new RequestParams();
	params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");

下載二進制形式的數據(如圖片,文件等)使用BinaryHttpResponseHandler:

 AsyncHttpClient client = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) {
	    @Override
	    public void onSuccess(byte[] fileData) {
	        // Do something with the file
	    }
	});

基本的http授權驗證:

AsyncHttpClient client = new AsyncHttpClient();
	client.setBasicAuth("username","password", new AuthScope("example.com", 80, AuthScope.ANY_REALM));
	client.get("http://example.com");

使用https安全連接:

AsyncHttpClient client = new AsyncHttpClient();
	SSLSocketFactory sf = createSSLSocketFactory();
		 if(sf != null){
			client.setSSLSocketFactory(sf);
		 }
		HttpProtocolParams.setUseExpectContinue(client.getHttpClient().getParams(), false);
		return client;


转载请注明出处:  http://blog.csdn.net/krislight

createSSLSocketFactory方法如下:

public static SSLSocketFactory createSSLSocketFactory(){
		MySSLSocketFactory sf = null;
		try {
			KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
			trustStore.load(null, null);
			sf = new MySSLSocketFactory(trustStore);
			sf.setHostnameVerifier(MySSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sf;
	}

其中MySSLSocketFactory定義

public class MySSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
    	injectHostname(socket, host);
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
    
    private void injectHostname(Socket socket, String host) {
        try {
            Field field = InetAddress.class.getDeclaredField("hostName");
            field.setAccessible(true);
            field.set(socket.getInetAddress(), host);
        } catch (Exception ignored) {
        }
    }
    
}


  

          
作者:u011176244 发表于2014-2-23 15:04:37 原文链接
阅读:83 评论:0 查看评论

相关 [asynchttpclient 开源 框架] 推荐:

AsyncHttpClient 开源框架學習研究

- - CSDN博客移动开发推荐文章
转载请注明出处: http://blog.csdn.net/krislight . AsyncHttpClient庫 基於Apache的HttpClient框架,是一個異步的httpClient, 所有的http請求都在子線程中,但是callback執行的線程和創建這個callback的線程是同一個(也即主線程創建的callback那麼執行的時候也是在主線程中).

开源Python UI框架:Kivy

- xin - 秀码趣 - ShowMuch.com
Kivy是一个可用以快速创建新颖用户界面应用的开源Python库,比如可以用它来创建多点触摸的应用程序,它具备跨平台特性,目前发行有Windows、MacOS、Linux以及Android版本. 作为一个开源框架,Kivy具备以下特性:A.百分百免费使用;B.基于 LGPL3协议 开源,对商业化应用友好;C.跨平台,支持Windows、MacOS、Linux以及Android;D.允许在不同的平台上运行同一套代码;E.稳定以及有完善的API文档;F.通过OpenGL ES 2.0对硬件进行加速;G.自然支持大部分的输入协议或者输入设备;H.基于Python的简单API……等等.

一些android开源框架

- - CSDN博客推荐文章
在目前软件开发行业中,流行着这么一句话“天下武功,唯快不破”. 而“快”,就不能让我们重复去制造论坛,不能去重新发明轮子. 目前开源界中已经有很多成熟的,得到了大量商用的开源软件和框架,我们就可以借鉴这有优秀的资源,才能在这个节奏速度的社会中博得一丝生存的机会. 我收集整理了一些优秀的android开源框架,希望能对android软件开发的朋友一点的帮助.

Grizzly 2.2发布,开源Java NIO框架

- - ITeye资讯频道
Grizzly框架近日 发布了2.2版本,该版本带来了相当多新特性与改进,而且加入了最新WebSocket规范的实现. Grizzly是一个应用程序框架,专门用于解决编写成千上万用户访问服务器时候产生的各种问题. Grizzly框架诞生于GlassFish项目,能够帮助开发人员利用Java NIO API构建可扩展、高性能、健壮的服务器,编写出可伸缩的服务器端应用.

8个网络安全开源框架

- - HTML5资源教程
能帮助构建、操作安全系统的开源项目多到数不清,尤其是随着对工具的安全监控和事件反应的要求不断加强的情况下,开源安全软件不得不提高自己的性能. 下面为你介绍10款开源的安全软件. Bro 是一款很强大的框架,用于网络分析和安全监控,它和常见的IDS有所不同. 与通用的网络传输分析工具相比它侧重于网络安全监控和提供一个完整的平台化工具.

CloverETL 3.5.0 发布,开源的 ETL 框架

- - 开源中国社区最新新闻
CloverETL 3.5.0 发布,此版本包括了之前两个里程碑版本的特性,更新内容如下:. 在社区版添加了 Hadoop 连接. ETL 是一切数据仓库应用的基础. CloverETL 是一个基于 Java 的开源的 ETL 框架,同时还包含了一个 ETL设计器——.

Kraken:PayPal公司的开源Node.js框架(转)

- - Java - 编程语言 - ITeye博客
PayPal 是一项全球流行的网上支付服务,近期它发布了一款  Node.js Web 开发框架: Kraken. Kraken 基于  grunt 和  Express,相比而言,它提供了更加稳健的功能合集,支持本地化、环境配置、更加注重应用程序安全等. 这里解释下,Express 是 Node.js 的一个 MVC 开发框架,支持 jade 等多种模板,是目前 Node.js 上最流行的 Web 开发框架,通过提供一系列强大特性帮助开发者创建各种 Web 应用.

开源Python网络爬虫框架Scrapy

- - 互联网实践
所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据. 不过由于一个网站的网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了. 一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样.

AsyncDisplayKit 1.0 发布,iOS 开源框架

- - 开源中国社区最新新闻
经过两个 Beta 版本之后,AsyncDisplayKit 1.0 发布了. AsyncDisplayKit是一款能够保持界面流畅性的iOS开源框架,即使是最复杂的用户界面,也可以让其流畅运行并快速响应. AsyncDisplayKit不止是Paper的组成部分,与Facebook神奇的动画引擎Pop也是关系密切.

基于Chrome开源提取的界面开发框架 三(.2)

- 大宝PKU - C++博客-首页原创精华区
svn: https://x-framework.googlecode.com/svn/trunk    建议重新下载代码. 很久没有在svn上更新这套库里,但自己有时间的时候都在开发增加功能. 这次的更新主要是在对activex的支持,一个界面库若想成为框架,必须具备这种包容性,至少flash /webbrowser等主流的控件还是会经常用到的.