項目地址:https://github.com/liaozhoubei/HttpAndParse
在這個時代锄列,什么都可以沒有,但是沒有網(wǎng)絡(luò)是萬萬不行的,那么我們get和post方式請求網(wǎng)絡(luò)的時候究竟有什么不同呢劲够?那么現(xiàn)在就讓我們來研究研究互聯(lián)網(wǎng)傳輸中的GET和POST方式的區(qū)別
GET解析
GET和POST都是用于發(fā)送HTTP請求的方式,而且是最常用的方式休傍。HTTP的全稱:超文本傳輸協(xié)議(HyperText Transfer Protocol)征绎,是一種發(fā)送和接收HTML頁面的方法。當然了HTTP的知識很多磨取,但對于一般開發(fā)者而言并不需要了解太多人柿,只需知道HTTP協(xié)議。
HTTP URL (URL是一種特殊類型的URI忙厌,包含了用于查找某個資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過HTTP協(xié)議來定位網(wǎng)絡(luò)資源凫岖;
host表示合法的Internet主機域名或者IP地址;
port指定一個端口號逢净,為空則使用缺省端口80哥放;
abs_path指定請求資源的URI;
如果URL中沒有給出abs_path爹土,那么當它作為請求URI時甥雕,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成胀茵。
eg:
1社露、輸入:www.guet.edu.cn
瀏覽器自動轉(zhuǎn)換成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp
這里不多說HTTP的太多理論知識琼娘,我們直接來看如何通過GET方式請求到HTTP吧呵哨!首先創(chuàng)建一個GetAndPost類,然后創(chuàng)建一個它的構(gòu)造方法轨奄,如下:
public class GetAndPost {
private String name;
private String password;
private String url;
public GetAndPost(String url, String name, String password) {
super();
this.name = name;
this.password = password;
this.url = url;
}
}
這個類很簡單孟害,我們就是發(fā)送一個注冊/登陸請求,其中的URL就是注冊/登陸請求的頁面的地址挪拟,然后輸入賬號和密碼挨务,如果賬號為root,密碼為123,則在eclipse中打印出“成功”谎柄,如果不是則打印“失敗”
接下來就是寫GET請求的代碼了丁侄,代碼如下:
public void doGet() {
try {
// 當出現(xiàn)亂碼時,可能是由于編碼錯誤引起朝巫,嘗試改變編碼格式鸿摇,使用URLEncoder.encode()方法
url = url + "?username=" + URLEncoder.encode(name, "UTF-8") + "&pwd=" + URLEncoder.encode(password, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
InputStream is = null;
InputStreamReader isr = null;
BufferedReader bufferedReader = null;
try {
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
// 設(shè)置讀取超時
connection.setReadTimeout(5000);
// 設(shè)置鏈接超時時間
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
// 獲得鏈接請求碼
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = connection.getInputStream();
isr = new InputStreamReader(is);
bufferedReader = new BufferedReader(isr);
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
System.out.println("Get方式的result:" + sb.toString());
}
}
···
// 關(guān)閉流的代碼
}
在上面的方法中對輸入的賬號名稱和密碼使用URLEncoder進行轉(zhuǎn)碼,這是因為如果對方網(wǎng)站如果使用的是UTF-8編碼劈猿,而你傳過去的又是GBK編碼拙吉,那么賬號密碼傳過去被解碼的時候會成為亂碼,這時可以將URLEncoder.encode(name, "UTF-8")改為URLEncoder.encode(name, "GBK")揪荣,即將賬號密碼轉(zhuǎn)為GBK格式傳輸過去筷黔。
在上面的GET方法的代碼有很多,但如果只是討論get獲取HTML仗颈,其核心代碼只有這五行:
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
// 設(shè)置讀取超時
connection.setReadTimeout(5000);
// 設(shè)置鏈接超時時間
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
首先我們要將String類的url地址轉(zhuǎn)換為URL對象佛舱,這時才可以通過HttpURLConnection打開鏈接地址,然后設(shè)置其讀取和鏈接的超時時間挨决,最后就是設(shè)置請求的方法请祖。
Get獲取HTML頁面就是如此。
那么該如何驗證它呢脖祈?已經(jīng)搭建好了一個現(xiàn)成的服務(wù)器已經(jīng)搭建好了肆捕,資源在項目地址的web文件夾下的bei.rar,解壓后在eclipse ee導(dǎo)入撒犀,使用tomcat7.0,然后運行即可掏秩。
在項目HttpAndParse中的RegisterActivity中設(shè)置一個GET方法的點擊事件或舞,代碼如下:
bt_get = (Button) findViewById(R.id.bt_get);
bt_get.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
final String name = et_name.getText().toString().trim();
final String password = et_password.getText().toString().trim();
new GetAndPost(url, name, password).doGet();;
}
}).start();
}
});
其中的et_name和et_password都是EditText。
在開啟本地服務(wù)器蒙幻,運行HttpAndParse項目映凳,點擊進入RegisterActivity頁面,然后賬號填root邮破,密碼為123诈豌,這時就會打印輸出“Get方式的result:成功”。
好了以上就是GET請求方式的全部內(nèi)容
POST請求方式
POST請求方式也是HTTP常用的網(wǎng)絡(luò)請求方式抒和。大家也許會有疑問矫渔,GET的請求方式已經(jīng)很好了,為什么還要有POST請求方式呢摧莽?
這有兩個原因:
1庙洼、GET發(fā)送請求時其數(shù)據(jù)大小有限制,理論上不能超過1k,而post則無此限制
2油够、GET請求時其發(fā)送的信息是以url明文發(fā)送的蚁袭,其參數(shù)會被保存在瀏覽器歷史或web服務(wù)器中,而post則不會
大家或許大致了解了兩者的區(qū)別石咬,但是不知道他們是如何表現(xiàn)出來的揩悄,那么下面我們直接通過get和post請求HTML來了解他們是如何表現(xiàn)出來吧。
繼續(xù)使用剛才的web服務(wù)器鬼悠,將登陸/注冊頁面打開删性,網(wǎng)址為:
http://192.168.xx.xx:8080/bei/
,其中192.168.xx.xx代表的是自己電腦的ip地址厦章。
然后將網(wǎng)址張貼到瀏覽器中打開镇匀,并且按F12將開發(fā)人員工具打開。
準備好之后袜啃,先點擊get方式登陸汗侵,在開發(fā)人員工具的網(wǎng)絡(luò)選項中得到下列信息:
然后點擊返回鍵,重新選擇post方式登陸群发,得到下列信息:
大家應(yīng)該注意到標紅色框的地方是兩者之間的不同之處了晰韵。
GET請求方式其請求URL后面附帶有賬號密碼的參數(shù):“?username=zhangsan&pwd=fwe”
而POST請求方式的URL只有一個單純的請求地址,而其請求頭方面則是多了這幾個:
"Content-Length" :請求內(nèi)容的長度熟妓,在本文指發(fā)送的賬號密碼
"Cache-Control" :控制HTTP緩存的方法
"Content-Type":表示具體請求中的媒體類型信息
"Origin":請求發(fā)起者
其中Origin可能根據(jù)瀏覽器的不同而出現(xiàn)或者消失雪猪。
OK,我們發(fā)現(xiàn)兩種的請求URL和請求頭有區(qū)別起愈,尤其是請求的URL只恨,在POST方法中根本沒有,那么去哪了呢抬虽?
詳細查看瀏覽器開發(fā)人員工具官觅,發(fā)現(xiàn)在post請求中正包含了賬號密碼的信息,原來這些信息是放到了這里阐污!
了解了這些之后休涤,我們終于知道兩者直接在請求之時的具體不同之處了,那么接下來就是該如何寫post請求方式的代碼了笛辟,在GetAndPost中添加POST請求方法功氨,代碼如下:
public void doPost() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader bufferedReader = null;
try {
URL httpUrl = new URL(url);
····
connection.setRequestMethod("POST");
String content = "username=" + name + "&pwd=" + password;
connection.setRequestProperty("Content-Length", content.length() + "");
connection.setRequestProperty("Cache-Control", "max-age=0");
connection.setRequestProperty("Origin", "http://192.168.2.124:8080");
OutputStream outputStream = connection.getOutputStream();
outputStream.write(content.getBytes());
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
·····
System.out.println("Post方式的result:" + sb.toString());
}
}
·····
}
詳細的代碼請查看項目,在上面的代碼中省略的都是與get方法相同的代碼手幢,我們在代碼中將Content-Length等請求頭信息寫好捷凄,然后通過OutputStream輸出流將請求正文(賬號密碼)轉(zhuǎn)換為字節(jié)輸出,發(fā)送到服務(wù)器中围来。
同樣的也是在RegisterActivity中使用纵势,代碼如下:
bt_post = (Button) findViewById(R.id.bt_post);
bt_post.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
final String name = et_name.getText().toString().trim();
final String password = et_password.getText().toString().trim();
new GetAndPost(url, name, password).doPost();;
}
}).start();
}
});
以上就是GET和POST請求方式的不同之處了踱阿,相信了解這些之后,對于get和post請求再也不會陌生了钦铁。
參考博客:
HTTP相關(guān)知識:
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
get與post區(qū)別:
http://blog.csdn.net/debugingstudy/article/details/10243605
淺談HTTP中Get與Post的區(qū)別
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
Cache-Control的相關(guān)博客:
http://www.cnblogs.com/yuyii/archive/2008/10/16/1312238.html
Content-Type的相關(guān)博客:
http://blog.csdn.net/blueheart20/article/details/45174399