Android的网络开发Http协议详解之一

在最近做一些东西需要利用到网络开发这一块,Android SDK集成的Apache HttpClient模块。要注意的是,这里的Apache HttpClient模块是HttpClient 4.0(org.apache.http.*),而不是Jakarta Commons HttpClient 3.x(org.apache.commons.httpclient.*)。主要是两种请求方式的使用:

先说一下HttpGet和HttpPost的一些区别:

1、Httpget方式在安全性上,Get的安全性要稍微差点,因为它会把信息直接在地址栏显示出来,httppost是设置在setentity方法中。
2、Httpget的URL长度不能超过2048,不难或出现异常。httppost就没有此限制。

下面是Http使用的一些步骤:
1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。
3.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。


以下是我的一个实例:
public class HttpUtils {

	private final static String TAG = HttpUtils.class.getSimpleName();

	private BasicHttpParams httpParams;
	private HttpClient httpClient;

	/**
	 * 获取HttpClient对象(设置一些参数)
	 * @return
	 */
	public HttpClient getHttpClient() {  
		// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)  
		this.httpParams = new BasicHttpParams();  
		// 设置连接超时和 Socket 超时,以及 Socket 缓存大小  
		HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);  
		HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);  
		HttpConnectionParams.setSocketBufferSize(httpParams, 8192);  
		// 设置重定向,缺省为 true  
		HttpClientParams.setRedirecting(httpParams, true);  
		// 设置 user agent  
		String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";  
		HttpProtocolParams.setUserAgent(httpParams, userAgent);  
		// 创建一个 HttpClient 实例  
		// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient  
		// 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient  
		httpClient = new DefaultHttpClient(httpParams);  
		return httpClient;  
	} 


	//使用HTTP GET调用有一个缺点就是,请求的参数作为URL一部分来传递,
	//以这种方式传递的时候,URL的长度应该在2048个字符之内。
	//如果超出这个这范围,就要使用到HTTP POST调用。
	/**
	 * @param params
	 */
	public static String HttpRequstDataByGet(String url, Map params) {
		String paramStr = "";  
		Iterator iter = params.entrySet().iterator();  
		while (iter.hasNext()) {  
			Map.Entry entry = (Map.Entry) iter.next();  
			Object key = entry.getKey();  
			Object val = entry.getValue();  
			paramStr += paramStr = "&" + key + "=" + val;  
		}  
		if (!paramStr.equals("")) {  
			paramStr = paramStr.replaceFirst("&", "?");  
			url += paramStr;  
		}  

		return HttpRequstDataByGet(url);
	}

	/**
	 * 利用get方式请求数据
	 * @param uri
	 */
	public static String HttpRequstDataByGet(String uri) {
		String resultStr = null;
		BufferedReader in = null;
		try {  
			//得到HttpClient对象  
			HttpClient getClient = new DefaultHttpClient();  
			//得到HttpGet对象  
			HttpGet request = new HttpGet(uri);  
			//客户端使用GET方式执行请教,获得服务器端的回应response  
			HttpResponse response = getClient.execute(request);  
			//判断请求是否成功    
			if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
				Log.i(TAG, "请求服务器端成功");  
				//获得输入流  
				InputStream  inStrem = response.getEntity().getContent();  
				in = new BufferedReader(new InputStreamReader(inStrem));
				String lineStr;
				StringBuffer string = new StringBuffer("");  
				while ((lineStr = in.readLine()) != null){  
					string.append(lineStr);
				}  
				//关闭输入流  
				inStrem.close(); 
				//另外一种方法strResult = EntityUtils.toString(httpResponse.getEntity()); 

			}else {  
				Log.i(TAG, "请求服务器端失败");  
			}             
		} catch (Exception e) {  
			// TODO Auto-generated catch block  
			e.printStackTrace();  
		} finally {  
			if (in != null) {  
				try {  
					in.close();  
				} catch (IOException e) {  
					e.printStackTrace();  
				}  
			}  
		}   
		return resultStr;
	}

	public static String HttpRequstDataByPost(String url, Map params) {
		List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
		Iterator iter = params.entrySet().iterator();  
		while (iter.hasNext()) {  
			Map.Entry entry = (Map.Entry) iter.next();  
			Object key = entry.getKey();  
			Object val = entry.getValue();  
			//添加要传递的参数    
			postParameters.add(new BasicNameValuePair(key.toString(), val.toString()));  
		}  
		return HttpRequstDataByPost(url, postParameters);
	}
	/**
	 * @param url
	 * @return
	 */
	public static String HttpRequstDataByPost(String url, List<NameValuePair> params) {
		String resultStr = null;
		BufferedReader in = null;  
		try {  
			HttpClient client = new DefaultHttpClient();  
			HttpPost request = new HttpPost(url);  
			//实例化UrlEncodedFormEntity对象  
			UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(  
					params);  
			//使用HttpPost对象来设置UrlEncodedFormEntity的Entity  
			request.setEntity(formEntity);  
			HttpResponse response = client.execute(request);  
			if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
				in = new BufferedReader(  
						new InputStreamReader(  
								response.getEntity().getContent()));  

				StringBuffer string = new StringBuffer("");  
				String lineStr = "";  
				while ((lineStr = in.readLine()) != null) {  
					string.append(lineStr + "\n");  
				}  
				in.close();  
				//另外一种方法resultStr = EntityUtils.toString(httpResponse.getEntity()); 
				resultStr = string.toString();  
				System.out.println(resultStr);  
			}else {
				Log.i(TAG, "请求服务器端失败");  
			}
		} catch(Exception e) {  
			// Do something about exceptions  
		} finally {  
			if (in != null) {  
				try {  
					in.close();  
				} catch (IOException e) {  
					e.printStackTrace();  
				}  
			}  
		}  
		return resultStr;
	}
httpget 和httpPost在相互转换使用的:
Httpget的Url的参数设置(直接拼接):
String YouDaoUrl = YouDaoBaseUrl + "?keyfrom=" + YouDaoKeyFrom  
				+ "&key=" + YouDaoKey + "&type=" + YouDaoType + "&doctype="  
				+ YouDaoDoctype + "&type=" + YouDaoType + "&version="  
				+ YouDaoVersion + "&q=" + keyWord;  
HttpPost的参数设置:
 //封装传递参数的集合
        List<NameValuePair> parameters = new ArrayList<NameValuePair>();
        //往这个集合中添加你要传递的参数
        parameters.add(new BasicNameValuePair("keyfrom", YouDaoKeyFrom));
        parameters.add(new BasicNameValuePair("key", YouDaoKey));
        parameters.add(new BasicNameValuePair("type", YouDaoType));
        parameters.add(new BasicNameValuePair("doctype", YouDaoDoctype));
        parameters.add(new BasicNameValuePair("version", YouDaoVersion));
        parameters.add(new BasicNameValuePair("q", keword));
        //创建传递参数封装 实体对象
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters);//设置传递参数的编码
        //把实体对象存入到httpPost对象中
        httpPost.setEntity(entity);


以上是个人对HttpClient的总结,希望对大家有用




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值