一、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;
}
}