访问网络之HttpClient和HttpUrlConnection

HttpClient对比HttpUrlConnection有比较丰富的api,但是不利于扩展和升级,加上android团队在优化HttpClient方面并不积极。

我比较倾向使用HttpUrlConnection,下面还是把两种访问网络的方法列出来以作比较。

HttpClient:

public String httpGet(String url, String params) throws Exception
	{
		String response = null; //返回信息
		//拼接请求URL
		if (null!=params&&!params.equals(""))
		{
			url += "?" + params;
		}
		
		int timeoutConnection = 3000;  
		int timeoutSocket = 5000;  
		HttpParams httpParameters = new BasicHttpParams(); 
	   <span style="white-space:pre">	</span>HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
	    <span style="white-space:pre">	</span>HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);  
	    
		// 构造HttpClient的实例
		HttpClient httpClient = new DefaultHttpClient(httpParameters);  
		// 创建GET方法的实例
		HttpGet httpGet = new HttpGet(url);
		try
		{
			HttpResponse httpResponse = httpClient.execute(httpGet);
			int statusCode = httpResponse.getStatusLine().getStatusCode();
			if (statusCode == HttpStatus.SC_OK) //SC_OK = 200
			{
				// 获得返回结果
				response = EntityUtils.toString(httpResponse.getEntity());
			}
			else
			{
				response = "返回码:"+statusCode;
			}
		} catch (Exception e)
		{
			throw new Exception(e);
		} 
		return response;
	}
1.首先设置连接超时和读取超时时间,并且使用HttpConnectionParams把这两个参数设置到HttpParams中。

2.之后根据HttpParams获取HttpClient实例。

3.根据Url获取HttpGet实例。

4.HttpClient执行HttpGet获取返回值HttpResponse。

5.读取HttpResponse中的数据。

public String httpPost(String url, List<Parameter> params) throws Exception
	{
		String response = null;
		int timeoutConnection = 3000;  
		int timeoutSocket = 5000;  
		HttpParams httpParameters = new BasicHttpParams();
	    <span style="white-space:pre">	</span>HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
	    <span style="white-space:pre">	</span>HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);  
		// 构造HttpClient的实例
		HttpClient httpClient = new DefaultHttpClient(httpParameters);  
		HttpPost httpPost = new HttpPost(url);
		if (params.size()>=0)
		{
			//设置httpPost请求参数
			httpPost.setEntity(new UrlEncodedFormEntity(buildNameValuePair(params),HTTP.UTF_8));
		}
		//使用execute方法发送HTTP Post请求,并返回HttpResponse对象
		HttpResponse httpResponse = httpClient.execute(httpPost);
		int statusCode = httpResponse.getStatusLine().getStatusCode();
        if (statusCode == HttpStatus.SC_OK)
        {
            //获得返回结果
            response = EntityUtils.toString(httpResponse.getEntity());
        } else {
            response = "返回码:" + statusCode;
        }
        return response;
	}
	
	/**
	 * 把Parameter类型集合转换成NameValuePair类型集合
	 * @param params 参数集合
	 * @return
	 */
	private List<BasicNameValuePair> buildNameValuePair(List<Parameter> params)
	{
		List<BasicNameValuePair> result = new ArrayList<BasicNameValuePair>();
		for (Parameter param : params)
		{
			BasicNameValuePair pair = new BasicNameValuePair(param.getName(), param.getValue());
			result.add(pair);
		}
		return result;
	}
}
设置了Post的请求参数post方法和get方法其实差不多,主要区别是调用了HttpPost.setEntity( )方法设置了post参数。

注意下设置参数的过程,首先新建了UrlEncodedFormEntity,新建UrlEncodedFormEntity又需要BasicNameValuePair类型的list,

方法buildNameValuePair完成了params到BasicNameValuePair的转换。

HttpUrlConnection:

 public static void sendHttpRquest(final String address, final HttpCallBackListener listener) {
        new Thread(new Runnable() {
            HttpURLConnection connection = null;
            @Override
            public void run() {
                try{
                    URL url = new URL(address);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    InputStream inputstream = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream));
                    StringBuilder responsStr = new StringBuilder();
                    String line;
                    while((line = reader.readLine())!=null) {
                        responsStr.append(line);
                    }
                    if (listener != null) {
                        listener.onFinish(responsStr.toString());
                    }
                }catch(Exception e) {
                    if (listener != null) {
                        listener.onError(e);
                    }
                }
                finally {
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }
1.HttpUrlConnection访问网络的方式是先根据地址创建Url对象。

2.根据Url对象获取HttpUrlConnection对象,并且设置连接超时和访问超时时间。

3.之后就可以的到数据的读取流了。

4.根据读取流读取相应的数据。

这里使用了回调方法的形式读取取得的数据。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。