android網絡數據請求之HttpClient

一、HttpClient體系主要概況;

二、HttpClient 的HttpGet和HttpPost的示例代碼。

對客戶端請求進行數據封裝和方法構建:

1. 主體:客戶端  public class org.apache.http.impl.client.

                   DefaultHttpClient extends AbstractHttpClient

          客戶端對象只有一個任務:發請求

          DefaultHttpClient client = new DefaultHttpClient();

          HttpResponse response = client.execute(get);

          HttpResponse response = client.execute(post);

2. 附體:請求方式  public class org.apache.http.client.methods:

                   1. HttpGet extends HttpRequestBase

                   2. HttpPost extends HttpEntityEnclosingRequestBase

          請求方式對象是對請求相關數據的封裝:

          get.setHeaders(headers);

          post.setHeaders(headers);

          post.setHeaders(headers);

          post.setParams(params);

          post.setEntity(entity);

3.數據:請求消息頭  public class org.apache.http.message.

                   BasicHeader implements org.apache.http.Header, java.lang.Cloneable

          請求頭是對消息頭的封裝:

          private static BasicHeader[] headers = new BasicHeader[10];

static {
        headers[0] = new BasicHeader("Appkey", "");
        headers[1] = new BasicHeader("Udid", "");
        headers[2] = new BasicHeader("Os", "");
        headers[3] = new BasicHeader("Osversion", "");
        headers[4] = new BasicHeader("Appversion", "");
        headers[5] = new BasicHeader("Sourceid", "");
        headers[6] = new BasicHeader("Ver", "");
        headers[7] = new BasicHeader("Userid", "");
        headers[8] = new BasicHeader("Usersession", "");
        headers[9] = new BasicHeader("Unique", "");
    }

4.數據:請求參數      public final class org.apache.http.params.

                   BasicHttpParams extends org.apache.http.params.AbstractHttpParams        implements java.io.Serializable, java.lang.Cloneabl

            請求參數是對請求規格進行封裝:

            HttpParams params = new BasicHttpParams();// 

            HttpConnectionParams.setConnectionTimeout(params, 8000);   //連接超時

            HttpConnectionParams.setSoTimeout(params, 5000);   //響應超時

5.實體:請求體          public class org.apache.http.client.entity.

                   UrlEncodedFormEntity extends StringEntity

                                StringEntity extends AbstractHttpEntity           implements java.lang.Cloneable

            請求體是HttpPost請求特有的數據封裝體:

            ArrayList<BasicNameValuePair> pairList = new ArrayList<BasicNameValuePair>();

            HttpEntity entity = new UrlEncodedFormEntity(pairList,"UTF-8");

            post.setEntity(entity);

響應

1.響應   public abstract interface org.apache.http.

               HttpResponse extends HttpMessage

            響應是對諸多返回結果的封裝體:

             HttpResponse response = client.execute(post);

             返回狀態行:StatusLine      response.getStatusLine();

             返回狀態碼:int                    statusLine.getStatusCode();

             返回數據實體:response.getEntity();

二、HttpClient 的HttpGet和HttpPost的示例代碼。

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
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.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
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.util.EntityUtils;
import org.json.JSONException;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
import com.xiaoo.R;
import com.xiaoo.vo.RequestVo;

/**
 * 網絡工具類:
 * 1.判斷網絡是否可用;
 * 2.get請求;
 * 3.post請求;
 * @author xiaoo
 *
 */
public class NetUtil {
	private static BasicHeader[] headers = new BasicHeader[10];
	static {
		headers[0] = new BasicHeader("Appkey", "");
		headers[1] = new BasicHeader("Udid", "");
		headers[2] = new BasicHeader("Os", "");
		headers[3] = new BasicHeader("Osversion", "");
		headers[4] = new BasicHeader("Appversion", "");
		headers[5] = new BasicHeader("Sourceid", "");
		headers[6] = new BasicHeader("Ver", "");
		headers[7] = new BasicHeader("Userid", "");
		headers[8] = new BasicHeader("Usersession", "");
		headers[9] = new BasicHeader("Unique", "");
	}
	
       /**
        * get請求
        * @param RequestVo json數據的解析目標對象;
        * @return object 返回  與RequestVo對應的object
        */
	public static boolean hasNetwork(Context context){
		ConnectivityManager con = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo workinfo = con.getActiveNetworkInfo();
		if(workinfo == null || !workinfo.isAvailable())
		{
			Toast.makeText(context, R.string.net_error, Toast.LENGTH_SHORT).show();
			return false;
		}
		return true;
	}


        public static Object get(RequestVo vo){
		DefaultHttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(vo.context.getString(R.string.app_host).concat(vo.context.getString(vo.requestUrl)));
		get.setHeaders(headers);
		Object obj = null;
		try {
			HttpResponse response = client.execute(get);
			if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
				String result = EntityUtils.toString(response.getEntity(),"UTF-8");
				Log.e(NetUtil.class.getSimpleName(), result);
				try {
					obj = vo.jsonParser.parseJSON(result);
				} catch (JSONException e) {
					Log.e(NetUtil.class.getSimpleName(), e.getLocalizedMessage(),e);
				}
				return obj;
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
/**
        * post請求:通過RequestVo對象,可以獲取到請求相關信息,並設置成HTTP協議的請求屬性,並請求數據
        * @param RequestVo json數據的解析目標對象;
        * @return object 返回  與RequestVo對應的object
        */
	public static Object post(RequestVo vo){
		DefaultHttpClient client = new DefaultHttpClient();
		Log.e("URL:", vo.context.getString(R.string.app_host).concat(vo.context.getString(vo.requestUrl)));
		HttpParams params = new BasicHttpParams();// 
		//params = new BasicHttpParams();   
	    
		//設置Conextion超時時間和Socket超時時間;
		HttpConnectionParams.setConnectionTimeout(params, 8000);   //連接超時
	    HttpConnectionParams.setSoTimeout(params, 5000);   //響應超時
	   
	    //拿到app_host,並追加requestUrl,組成請求對象HttpPost;
	    HttpPost post = new HttpPost(vo.context.getString(R.string.app_host).concat(vo.context.getString(vo.requestUrl)));
		//給HttpPost設置BasicHttpParams,和BasicHeader[];
	    post.setParams(params);
		post.setHeaders(headers);
		
		//準備一個Object對象引用;
		Object obj = null;
		
		try {
			/**
			 * 如果請求數據映射requestDataMap不爲null,就從中獲取條目Map.Entry,
			 * 並生成基本名值對BasicNameValueParir,並添加到數組集合中,以便創建HttpEntity;
			 */
			if(vo.requestDataMap!=null){
				HashMap<String,String> map = vo.requestDataMap;
				ArrayList<BasicNameValuePair> pairList = new ArrayList<BasicNameValuePair>();
				for(Map.Entry<String,String> entry:map.entrySet()){
					BasicNameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue());
					pairList.add(pair);
				}
				//把BasicNameValuePair數組集合,以"UTF-8"編碼,編碼成Url HttpEntity;
				HttpEntity entity = new UrlEncodedFormEntity(pairList,"UTF-8");
				post.setEntity(entity);
				//StringEntity
			}
			//讓DefaultHttpClient執行HttpPost,完成請求post;
			HttpResponse response = client.execute(post);//包含響應的狀態和返回的結果==
			if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
				String result = EntityUtils.toString(response.getEntity(),"UTF-8");
				Log.e(NetUtil.class.getSimpleName(), result);
				try {
					obj = vo.jsonParser.parseJSON(result);
				} catch (JSONException e) {
					Log.e(NetUtil.class.getSimpleName(), e.getLocalizedMessage(),e);
				}
				return obj;
			}
		} catch (ClientProtocolException e) {
			Log.e(NetUtil.class.getSimpleName(), e.getLocalizedMessage(),e);
		} catch (IOException e) {
			Log.e(NetUtil.class.getSimpleName(), e.getLocalizedMessage(),e);
		}
		return null;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章