Http使用get或post請求網絡數據

使用http請求網絡數據——理解純屬個人總結和查詢網絡資料,如有不對請回復點出,不勝感激!!!!

有很多人使用hettp請求網絡的時候,總是想問,get和post那個好啊?他們的區別是什麼?甚至一些面試題也是這樣寫的!所以我搜了一些資料,衆說紛紜啊,以至於我自己都不確定自己找的資料是否靠譜


1、get和post區別,但是很多人都有誤解,大概區分一下,如下(我感覺比較容易理解,但是下面的說話並不嚴謹)


第一點:GET把參數包含在URL中,POST通過request body傳遞參數(此說法不嚴禁)

1、GET和POST是什麼?

答:HTTP協議中的兩種發送請求的方法。

2、HTTP是什麼?

答:HTTP協議中的兩種發送請求的方法。

3、HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,那麼兩者有啥區別呢?

答:GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的

4、所以我們說,GET把參數包含在URL中,POST通過request body傳遞參數是不嚴謹的

有一個哥們舉例很合適說:在萬維網世界中,TCP就像汽車。我們用TCP來運輸數據,它很可靠,從來不會發生丟件少件的現象。但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,如果路上出現車禍,整個交通系統一定會癱瘓。爲了避免這種情況發生,交通規則HTTP誕生了。HTTP給汽車運輸設定了好幾個服務類別,有GET, POST, PUT, DELETE等等,HTTP規定,當執行GET請求的時候,要給汽車貼上GET的標籤(設置method爲GET),而且要求把傳送的數據放在車頂上(url中)以方便記錄。如果是POST請求,就要在車上貼上POST的標籤,並把貨物放在車廂裏。當然,你也可以在GET的時候往車廂內偷偷藏點貨物,但是這是很不光彩;也可以在POST的時候在車頂上也放一些數據,讓人覺得傻乎乎的。HTTP只是個行爲準則,而TCP纔是GET和POST怎麼實現的基本。


第二點:GET的URL會有長度上的限制,則POST的數據則可以非常大(此說法也不嚴謹)

在大萬維網世界中,還有另一個重要的角色:運輸公司。不同的瀏覽器(發起http請求)和服務器(接受http請求)是不同的運輸公司。 雖然理論上,你可以在車頂上無限的堆貨物(url中無限加參數)。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數據量太大對瀏覽器和服務器都是很大負擔。業界不成文的規定是,(大多數)瀏覽器通常都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。超過的部分,恕不處理。如果你用GET服務,在request body偷偷藏了數據,不同服務器的處理方式也是不同的,有些服務器會幫你卸貨,讀出數據,有些服務器直接忽略,所以,雖然GET可以帶request body,也不能保證一定能被接收到哦。


第三點:POST比GET安全,因爲數據在地址欄上不可見(此說法也不嚴謹)

就像我們在第一點舉例一樣,如果是POST請求,就要在車上貼上POST的標籤,並把貨物放在車廂裏。當然,你也可以在GET的時候往車廂內偷偷藏點貨物都是可以的,只不過給人的感覺不合理而已,並不是一定不行


第四點:GET和POST還有一個重大區別是:GET產生一個TCP數據包,而POST產生兩個TCP數據包(但又不是絕對)

1、對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);

2、而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。

3、也就是說,GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然後再回頭把貨送過去。

4、因爲POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。爲什麼?

5、GET與POST都有自己的語義,不能隨便混用。

6、 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。

7、但並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。


總結:GET和POST只是發送機制不同,get請求不會改變服務器的數據,但是post是可以更新的,好比我們csdn網站,評論提交好像就是通過post的。然後你的評論就會出現在了網頁中。但是使用get,你只能進入這個網頁,但是你不能使你進入的網頁更改信息

上述總結是我查詢資料個人總結,如果理解不對,還請指點出來,畢竟小白還是個菜鳥,萬分感謝


2、使用http訪問網絡數據案例

  • 怎麼獲得一個網絡連接的,這裏我也說一下,通過有道翻譯API,可以獲取一個測試連接,

這裏寫圖片描述

  • 所以註冊,郵箱也可所以填寫,也可以直接向下拉,就可以看到我用的連接了。

這裏寫圖片描述
這裏寫圖片描述


一、使用get方式請求網絡數據

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;


public class HttpGet02 {

  public static void main(String[] args) {
      //啓動線程,開始執行網絡獲取
    new MyThread03().start();

  }
}

class MyThread03 extends Thread{
    @Override
    public void run() {
        // 我們在子線程中處理數據

        try {
            //我們這裏用我自己申請的網絡地址,get可以直接一串一起傳遞,但是post不建議如此,也算兩者的區分把
            URL url = new URL("http://fanyi.youdao.com/openapi.do?keyfrom=Xiaobaid&key=329647385&type=data&doctype=json&version=1.1&q=welcom");   
            //我們創建了一個url路徑,就要打開這個連接,使用的是openConnection()方法
            URLConnection connection = url.openConnection();

            //我們打開連接之後,我們就要獲取它 輸入流,

            InputStreamReader iR = new InputStreamReader(connection.getInputStream(),"UTF-8");
            BufferedReader bf = new BufferedReader(iR);

            //我們獲取了這些數據之後,我們寫在一個文件中
                FileOutputStream fOutputStream=new FileOutputStream("d://datas.xml");

                OutputStreamWriter iWriter = new OutputStreamWriter(fOutputStream);
                BufferedWriter  bW= new BufferedWriter(iWriter);

                String ling;
                while ((ling = bf.readLine())!=null) {
                    System.out.println(ling);
                    bW.write(ling);
                }
                bW.close();
                iWriter.close();
                fOutputStream.close();
                bf.close();
                iR.close();
                System.out.println("寫入成功");



        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        super.run();
    }
}

  • 運行結果
    這裏寫圖片描述

二、使用post方式請求網絡數據

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;


public class HttpPostss {
    /*
     * */


    public static void main(String[] args) {
        new MyPostThread().start();
    }


    static class MyPostThread extends Thread{
        @Override
        public void run() {
            // http使用post來請求網絡數據
            try {
                //利用post強求,請求的是真是的網址,而後面的的資源數據,則是通過網絡的輸出流,這是和get請求不同的一點
                URL url = new URL("http://fanyi.youdao.com/openapi.do");
                //通過url.openConnection()打開互聯網連接,然後通過一個HttpURLConnection來接受。
                HttpURLConnection huConnection=(HttpURLConnection) url.openConnection();

                //然後需要給huConnection對象設置我們需要的參數。例如,編碼格式、獲取數據和輸出數據、請求方式。
                huConnection.addRequestProperty("encoding", "utf-8");

                //設置爲ture,我們的huConnection對象才能獲取數據
                huConnection.setDoInput(true);
                //設置爲ture,我們的huConnection對象才能向網絡傳輸數據
                huConnection.setDoOutput(true);
                //設置請求方法爲POST
                huConnection.setRequestMethod("POST");

                //第一步:創建輸出流,使用bw對象想服務器傳輸,我們網址後面的請求參數
                OutputStream oS = huConnection.getOutputStream();
                OutputStreamWriter ow= new OutputStreamWriter(oS);
                BufferedWriter bw = new BufferedWriter(ow);

                bw.write("keyfrom=Xiaobaid&key=329647385&type=data&doctype=json&version=1.1&q=welcom");
                bw.flush();

                //第二部:創建輸入輸入流,我們上面已經對服氣發送了請求的參數,我們用輸入流來接受,服務器返回給我們的數據
                InputStream inputS = huConnection.getInputStream();
                InputStreamReader is = new InputStreamReader(inputS);
                BufferedReader br = new BufferedReader(is);



                //第三步:我們再創建一個輸出流,把我們獲取到的服務器數據,保存到本地的一個文檔中

                FileOutputStream fs = new FileOutputStream("d://datess.json");
                OutputStreamWriter osw = new OutputStreamWriter(fs);
                BufferedWriter bWriter = new BufferedWriter(osw);



                String vulue;
                while ((vulue=br.readLine())!=null ) {
                    //我們把我們獲取到的資源,打印一下,方便我們觀看是否請求成功
                    System.out.println(vulue);
                    //這裏我們還可以在創建一個文檔,把我們獲取的存取到一個新文檔裏
                    bWriter.write(vulue+"\r\n");
                }

                bw.close();
                bWriter.close();
                br.close();
                ow.close();
                oS.close();
                is.close();
                inputS.close();
                osw.close();
                fs.close();


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
  • 運行結果
    這裏寫圖片描述

demo地址:http://download.csdn.net/detail/bobo8945510/9670316

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章