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).commit();
}
/** * 从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();
}
}
当客户端需要进行网络请求服务时可以结合请求方式,进行使用。
未完待续。。。