您的位置:首页 > 理论基础 > 计算机网络

android学习日记-3 Apache的HttpClient

2014-05-07 17:38 316 查看
1 需要现在配置文件中manifest中注册网络:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


2 封装方法:

package com.znn.roundprogress;

import java.util.ArrayList;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

public class HttpClientUtli {
private static HttpClient httpClient;

private HttpClientUtli() {

}

private static synchronized HttpClient getHttpClient() {
if (null == httpClient) {
// 设置一些基本参数
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams.setUserAgent(params,
System.getProperty("http-agent"));
/* 从连接池中取连接的超时时间 */
ConnManagerParams.setTimeout(params, 1000);
HttpConnectionParams.setConnectionTimeout(params, 2000);
/* 请求超时 即从服务器获取响应数据需要等待的时间,此处设置为4秒。 */
HttpConnectionParams.setSoTimeout(params, 4000);
/*
* Scheme类表示一个协议方案,例如"http"或者"https"和包含许多的协议属性,
* 例如缺省的端口和socket工厂常用于为指定的协议创建java
* .net.Socket实例,SchemeRegistry类被用来维护一个Schemes的集合
* 设置我们的HttpClient支持HTTP和HTTPS两种模式
*/
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory
.getSocketFactory(), 443));
/*
* 初始化httpclient会话连接管理器
* HTTP连接是复杂、有状态的,非线程安全的对象需要适当的管理正确的功能。HTTP连接每次仅被一个执行的线程使用,
* HttpClient利用一个特殊的实体管理访问HTTP连接
* ,称为HTTP连接管理器,由ClientConnectionManager接口表示。
* HTTP连接管理器的充当一个新的HTTP连接工厂,管理持续的连接和同步的访问持续的连接,确保每次只有一个线程能访问连接。
*/
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
params, schReg);
/*
* 初始化httpClient并加入会话连接管理器,此步很重要,对于使用httpclient多线程并发访问服务系统很有用
* HttpClient最重要的功能是执行HTTP方法。执行一个HTTP方法涉及一个或多个HTTP请求/ HTTP响应信息交流,
* 通常是由HttpClient内部处理。用户提供一个请求对象,HttpClient发送请求到目标服务器,
* 希望服务器返回一个相应的响应对象,或者抛出一个异常(如果执行失败)。
*/
httpClient=new DefaultHttpClient(conMgr,params);
}
return httpClient;

}
public static String doPost(String path,Map<String,String> map){
HttpClient httpclient =getHttpClient();
HttpPost httpPost=new HttpPost(path);
ArrayList<NameValuePair> list=new ArrayList<NameValuePair>();
for(Map.Entry<String, String>entry:map.entrySet()){
list.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));
}
try{
httpPost.setEntity(new UrlEncodedFormEntity(list,HTTP.UTF_8));
httpPost.addHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
httpPost.addHeader("Connection","keep-alive");
httpPost.addHeader("Referer","Android");
HttpResponse response=httpclient.execute(httpPost);
//			int i=response.getStatusLine().getStatusCode();
//			System.out.println("response.getStatusLine().getStatusCode()"+i);
//如果状态码是200,则正常返回
if(response.getStatusLine().getStatusCode()==200){
//获得返回的字符串
String body=EntityUtils.toString(response.getEntity());
System.out.println(body);
//如果是下载的文件,可以用response.getEntity().getContent返回InputStream
return body;
}else{
return null;
}
}catch(Exception e){
e.printStackTrace();
return null;

}

}
public static String doGet(String path){
HttpClient httpclient=getHttpClient();
try{
HttpGet httpGet=new HttpGet();
httpGet.addHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
httpGet.addHeader("Connection","keep-alive");
httpGet.addHeader("Referer","Android");
HttpResponse response=httpclient.execute(httpGet);
if(response.getStatusLine().getStatusCode()==200){
String body=EntityUtils.toString(response.getEntity());
System.out.println(body);
return body;
}else{
return null;
}
}catch(Exception e){
e.printStackTrace();
return null;
}
}

}

3 MainActivity中调用

oncreate()方法中:

new Thread(){
public void run() {
// HttpClientUtli.doPost();
Map<String, String> map = new HashMap<String, String>();
map.put("uname", "qdzs");
map.put("passwd", "13356235875");
String ss=HttpClientUtli.doPost(" http://zningning.duapp.com/qdhelper/new/user/getdetail.php", map);
System.out.println("http"+ss);
// HttpClientUtli.doGet(" http://www.baidu.com"); };
}.start();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: