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

android开发框架(一)HTTP通信

2015-12-18 16:33 573 查看

android开发中,通信相关技术包括 http、socket、Bluetooth、NFC、HeadSet、USB,本篇主要介绍Http请求方式

HTTP:超文本传输协议,是互联网上应用最为广泛的网络通信协议;

包括httpclient、httpConnection

客户端与服务器建立连接,客户端发送请求,服务器接收请求并返回信息,客户端处理信息;

1.两种主要的请求方式 Get和Post

Get与Post请求区别:

Post请求可以向服务器传送数据,而且数据放在HTML HEADER内一起传送到服务端URL地址,将数据绑定在httpPost对象中,数据对用户不可见。

而Get是把参数数据队列加到提交的URL中,值和表单内各个字段一一对应,

例如(https://www.baidu.com/s?wd=android

Get 传送的数据量较小,不能大于2KB。Post传送的数据量较大,一般被默认为不受限制。

get安全性非常低,post安全性较高。

2.两种请求代码实现

Post请求

public String httpPost(String url,ArrayList<Param> params){
String response=null;
int timeoutConncetion=2000;
int timeoutSocket=2000;
HttpParams httpParams=new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeoutConncetion);
HttpConnectionParams.setSoTimeout(httpParams, timeoutSocket);
HttpPost httpPost=new HttpPost(url);

Log.i("url", url);
if(params!=null){
try {
httpPost.setEntity(new UrlEncodedFormEntity(list(params),HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
try {
HttpResponse httpResponse=  httpClient.execute(httpPost);

int resStatus=httpResponse.getStatusLine().getStatusCode();
System.out.println(resStatus);
if(resStatus==HttpStatus.SC_OK){
//获得cookie
//getCookie(httpClient);
response=EntityUtils.toString(httpResponse.getEntity());

}else{
return response;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}

public List<NameValuePair> list(ArrayList<Param> params){
ArrayList<NameValuePair> list=new ArrayList<NameValuePair>();
for(Param p:params){
NameValuePair pair=new BasicNameValuePair(p.getName(),p.getValue());
list.add(pair);
}
return list;
}


Get请求

public String httpGet(String url,ArrayList<Param> params){
String response = null;
StringBuffer urlstr=new StringBuffer(url);
if(params!=null){
urlstr.append("?");
for(Param p:params){
urlstr.append(p.getName()+"=").append(p.getValue()+"&");
}
urlstr.deleteCharAt(urlstr.length()-1);
}
String urlcon=urlstr.toString();
System.out.println(urlcon);
int timeoutConnection=15000;
int timeoutSocket=15000;
HttpParams httpParams=new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeoutConnection);
HttpConnectionParams.setSoTimeout(httpParams, timeoutSocket);
HttpGet httpGet=new HttpGet(urlcon);
//添加cookie到http请求中
//httpGet.setHeader("Cookie", Utils.getPreference("cookie"));
try {
httpClient = new DefaultHttpClient(httpParams);
HttpResponse httpResponse=httpClient.execute(httpGet);
int resStatus=httpResponse.getStatusLine().getStatusCode();
if(resStatus==HttpStatus.SC_OK){
//getCookie(httpClient);
//将返回数据转成字符串类型
response=EntityUtils.toString(httpResponse.getEntity(),"UTF_8");

}else{
response="返回码为:"+resStatus;
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}


3.Cookie使用

当在Android客户端发送请求时,需要使用到Cookie用来维持用户登录状态

通常是在发送登录请求时获取cookie并通过sharedpreferences进行保存,在其他请求时

通过setHeader的方式加入到http中。

获取Cookie代码

public void getCookie(DefaultHttpClient httpClient) {
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cookies.size(); i++) {
Cookie cookie = cookies.get(i);
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
if (!TextUtils.isEmpty(cookieName)
&& !TextUtils.isEmpty(cookieValue)) {
sb.append(cookieName + "=");
sb.append(cookieValue + ";");
}
}
Log.e("cookie", sb.toString());
System.out.println(MyApp.mContext);
System.out.println(sb.toString());
savePreference("cookie", sb.toString());
}


保存和获取cookie的代码实例:

/**
* 保存数据到sp
* @param key
* @param value
*/
public static void savePreference(String key, String value) {
PreferenceManager.getDefaultSharedPreferences(MyApp.mContext).edit().putString(key, value).co
b499
mmit();
}

/**
* 从sp中取数据
* @param mContext
* @param key
* @return
*/
public static String getPreference(String key) {
return PreferenceManager.getDefaultSharedPreferences(MyApp.mContext).getString(key, "");
}


MyApp类继承Application,并在AndroidManifest中注册

public class MyApp extends Application {

public static Context mContext = null;

@Override
public void onCreate() {
super.onCreate();
mContext=getApplicationContext();
}
}


当客户端需要进行网络请求服务时可以结合请求方式,进行使用。

未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android android开发 Http