GET與POST請求詳解

項目地址: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ò)選項中得到下列信息:

GET.png

然后點擊返回鍵,重新選擇post方式登陸群发,得到下列信息:

post.png

大家應(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請求中正包含了賬號密碼的信息,原來這些信息是放到了這里阐污!

Post2.png

了解了這些之后休涤,我們終于知道兩者直接在請求之時的具體不同之處了,那么接下來就是該如何寫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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末软舌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牛曹,更是在濱河造成了極大的恐慌佛点,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黎比,死亡現(xiàn)場離奇詭異超营,居然都是意外死亡,警方通過查閱死者的電腦和手機阅虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門演闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颓帝,你說我怎么就攤上這事米碰。” “怎么了购城?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵吕座,是天一觀的道長。 經(jīng)常有香客問我瘪板,道長吴趴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任侮攀,我火速辦了婚禮锣枝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兰英。我一直安慰自己撇叁,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布箭昵。 她就那樣靜靜地躺著税朴,像睡著了一般回季。 火紅的嫁衣襯著肌膚如雪家制。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天泡一,我揣著相機與錄音颤殴,去河邊找鬼。 笑死鼻忠,一個胖子當著我的面吹牛涵但,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼矮瘟,長吁一口氣:“原來是場噩夢啊……” “哼瞳脓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澈侠,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤劫侧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哨啃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烧栋,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年拳球,在試婚紗的時候發(fā)現(xiàn)自己被綠了审姓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡祝峻,死狀恐怖魔吐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呼猪,我是刑警寧澤画畅,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站宋距,受9級特大地震影響轴踱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谚赎,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一淫僻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壶唤,春花似錦雳灵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迎吵,卻和暖如春躲撰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背击费。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工拢蛋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔫巩。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓谆棱,卻偏偏與公主長得像快压,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垃瞧,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蔫劣,服務(wù)發(fā)現(xiàn),斷路器个从,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)拦宣,內(nèi)容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,210評論 3 82
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評論 25 707
  • 提到邏輯這個話題,我想起一個學(xué)應(yīng)用物理的朋友信姓,有天我去他寢室看到《邏輯學(xué)》這本書鸵隧,饒有興趣的問他:“你們還學(xué)《邏輯...
    Gunn閱讀 706評論 1 2
  • 前段時間看到朋友圈里有一個段子,關(guān)于讀書與不讀書的區(qū)別: 為會么要讀書意推?舉個簡單的例子吧豆瘫,當你看到“雪打柿子”,你...
    于福芹美好生活更美好閱讀 1,020評論 0 0