android提交服务器,Android向WEB服务器提交数据
說明:
1、本系列博文是博主在學習傳智播客Android培訓視頻的學習筆記
2、當然博文不只是羅列視頻上講的知識點,通過查閱資料對一些知識點進行了詳細的講解
3、由于是初學,難免有疏漏之處,還請不吝賜教
一、HTTP中POST和GET的區別
向WEB服務器提交數據,無外乎兩種方式:POST和GET。那么這兩種方式向服務器提交數據的區別有哪些呢?
1、GET將表單或者其他要傳遞的數據安裝variable=value的形式,添加到Action所指向URL的后面,用?連接,而各個變量之間用&連接;POST是將數據以鍵值對的方式存放在HTTP包的包體中。
2、POST的安全性要比GET的安全性更高。比如通過GET方式提交數據,用戶名和密碼將以明文的方式出現在URL中,登錄頁面也可能被瀏覽器緩存,其他人通過查看歷史記錄就可以拿到你的賬號和密碼了。
3、GET傳輸的數據量小,主要是因為受URL長度限制,而POST可以傳輸大量的數據,所以在上傳文件時最好使用POST。
4、GET限制Form表單的數據集的值必須為ASCII字符;而POST支持整個ISO10646字符集。默認是用ISO-8859-1編碼。
二、通過HTTPWATCH可以直觀的看到上面的區別
GET方式提交表單數據,如下:
POST方式提交表單數據(name為中文,編碼已經轉換),如下:
三、服務器端取得數據亂碼的處理方式
服務端中文亂碼的處理方式主要通過兩個方面:1、添加過濾器處理編碼問題,2、tomcat(或者其他web服務器)更改默認編碼。以下是servlet過濾器源碼:EncodingFilter.java(過濾器)和EncodingRequestWrapper.java(編碼轉換處理程序)
publicclassEncodingFilterimplementsFilter?{
publicvoiddoFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)throwsIOException,?ServletException?{
HttpServletRequest?req?=?(HttpServletRequest)?request;
if("GET".equals(req.getMethod())){
EncodingRequestWrapper?wrapper?=?newEncodingRequestWrapper(req);
chain.doFilter(wrapper,?response);
}else{
req.setCharacterEncoding("UTF-8");
chain.doFilter(request,?response);
}
}
}
publicclassEncodingRequestWrapperextendsHttpServletRequestWrapper?{
privateHttpServletRequest?request;
publicEncodingRequestWrapper(HttpServletRequest?request)?{
super(request);
this.request?=?request;
}
/**
*?重寫getParamter方法
*/
publicString?getParameter(String?name)?{
String?value?=?request.getParameter(name);
if(value!=null){
try{
//編碼轉換
value?=?newString(value.getBytes("ISO8859-1"),"UTF-8");
}?catch(UnsupportedEncodingException?e)?{
e.printStackTrace();
}
}
returnvalue;
}
}
WEB端的配置web.xml增加filter,示例如下:
EncodingFilter
EncodingFilter
cn.itcast.filter.EncodingFilter
EncodingFilter
/*
四、Android應用客戶端向WEB服務端提交數據的4中方式
示例代碼中包含開源組件httpclient向服務器傳遞數據時的POST和GET方式提交,如果不包含對session和cookie等操作,純粹是向WEB服務端傳遞數據,那么建議直接采用POST和GET提交,不建議使用httpclient。示例代碼:
/**
*?Android中向web服務器提交數據的兩種方式四種方法
*/
publicclassSubmitDataByHttpClientAndOrdinaryWay?{
/**
*?使用get請求以普通方式提交數據
*?@param?map?傳遞進來的數據,以map的形式進行了封裝
*?@param?path?要求服務器servlet的地址
*?@return?返回的boolean類型的參數
*?@throws?Exception
*/
publicBoolean?submitDataByDoGet(Map?map,?String?path)throwsException?{
//?拼湊出請求地址
StringBuilder?sb?=?newStringBuilder(path);
sb.append("?");
for(Map.Entry?entry?:?map.entrySet())?{
sb.append(entry.getKey()).append("=").append(entry.getValue());
sb.append("&");
}
sb.deleteCharAt(sb.length()?-?1);
String?str?=?sb.toString();
System.out.println(str);
URL?Url?=?newURL(str);
HttpURLConnection?HttpConn?=?(HttpURLConnection)?Url.openConnection();
HttpConn.setRequestMethod("GET");
HttpConn.setReadTimeout(5000);
//?GET方式的請求不用設置什么DoOutPut()之類的嗎?
if(HttpConn.getResponseCode()?==?HttpURLConnection.HTTP_OK)?{
returntrue;
}
returnfalse;
}
/**
*?普通方式的DoPost請求提交數據
*?@param?map?傳遞進來的數據,以map的形式進行了封裝
*?@param?path?要求服務器servlet的地址
*?@return?返回的boolean類型的參數
*?@throws?Exception
*/
publicBoolean?submitDataByDoPost(Map?map,?String?path)throwsException?{
//?注意Post地址中是不帶參數的,所以newURL的時候要注意不能加上后面的參數
URL?Url?=?newURL(path);
//?Post方式提交的時候參數和URL是分開提交的,參數形式是這樣子的:name=y&age=6
StringBuilder?sb?=?newStringBuilder();
//?sb.append("?");
for(Map.Entry?entry?:?map.entrySet())?{
sb.append(entry.getKey()).append("=").append(entry.getValue());
sb.append("&");
}
sb.deleteCharAt(sb.length()?-?1);
String?str?=?sb.toString();
HttpURLConnection?HttpConn?=?(HttpURLConnection)?Url.openConnection();
HttpConn.setRequestMethod("POST");
HttpConn.setReadTimeout(5000);
HttpConn.setDoOutput(true);
HttpConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
HttpConn.setRequestProperty("Content-Length",?String.valueOf(str.getBytes().length));
OutputStream?os?=?HttpConn.getOutputStream();
os.write(str.getBytes());
if(HttpConn.getResponseCode()?==?HttpURLConnection.HTTP_OK)?{
returntrue;
}
returnfalse;
}
/**
*?以HttpClient的DoGet方式向服務器發送請數據
*?@param?map?傳遞進來的數據,以map的形式進行了封裝
*?@param?path?要求服務器servlet的地址
*?@return?返回的boolean類型的參數
*?@throws?Exception
*/
publicBoolean?submitDataByHttpClientDoGet(Map?map,?String?path)throwsException?{
HttpClient?hc?=?newDefaultHttpClient();
//?請求路徑
StringBuilder?sb?=?newStringBuilder(path);
sb.append("?");
for(Map.Entry?entry?:?map.entrySet())?{
sb.append(entry.getKey()).append("=").append(entry.getValue());
sb.append("&");
}
sb.deleteCharAt(sb.length()?-?1);
String?str?=?sb.toString();
System.out.println(str);
HttpGet?request?=?newHttpGet(sb.toString());
HttpResponse?response?=?hc.execute(request);
if(response.getStatusLine().getStatusCode()?==?HttpURLConnection.HTTP_OK)?{
returntrue;
}
returnfalse;
}
/**
*?以HttpClient的DoPost方式提交數據到服務器
*?@param?map?傳遞進來的數據,以map的形式進行了封裝
*?@param?path?要求服務器servlet的地址
*?@return?返回的boolean類型的參數
*?@throws?Exception
*/
publicBoolean?submintDataByHttpClientDoPost(Map?map,?String?path)throwsException?{
//?1.?獲得一個相當于瀏覽器對象HttpClient,使用這個接口的實現類來創建對象,DefaultHttpClient
HttpClient?hc?=?newDefaultHttpClient();
//?DoPost方式請求的時候設置請求,關鍵是路徑
HttpPost?request?=?newHttpPost(path);
//?2.?為請求設置請求參數,也即是將要上傳到web服務器上的參數
List?parameters?=?newArrayList();
for(Map.Entry?entry?:?map.entrySet())?{
NameValuePair?nameValuePairs?=?newBasicNameValuePair(entry.getKey(),?entry.getValue());
parameters.add(nameValuePairs);
}
//?請求實體HttpEntity也是一個接口,我們用它的實現類UrlEncodedFormEntity來創建對象,注意后面一個String類型的參數是用來指定編碼的
HttpEntity?entity?=?newUrlEncodedFormEntity(parameters,"UTF-8");
request.setEntity(entity);
//?3.?執行請求
HttpResponse?response?=?hc.execute(request);
//?4.?通過返回碼來判斷請求成功與否
if(response.getStatusLine().getStatusCode()?==?HttpURLConnection.HTTP_OK)?{
returntrue;
}
returnfalse;
}
}
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的android提交服务器,Android向WEB服务器提交数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言引用文件空格和换行,关于文件操作,
- 下一篇: android如何设置软件的版本,假的设