1. 程式人生 > >HttpURLConnection的GET請求POST請求小總結

HttpURLConnection的GET請求POST請求小總結

GET請求程式碼如下:

//網路請求是一個耗時操作,要在子執行緒裡面開啟
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //get請求的url
                    URL url=new URL("http://192.168.2.135:8080/web/MyProject?username=zhangsan&password=123");
                    //url寫法:    協議://IP地址:埠號/訪問的檔案
                    //協議一般是http,IP地址是要訪問的IP地址,埠一般是8080,然後加上訪問的是什麼
                    //新建一個HttpURLConnection,從url開啟一個連線
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                    //設定請求的模式
                    connection.setRequestMethod("GET");
                    //設定請求連線超時時間
                    connection.setConnectTimeout(5000);
                    //設定訪問時的超時時間
                    connection.setReadTimeout(5000);
                    //開啟連線
                    connection.connect();
                    InputStream inputStream=null;
                    BufferedReader reader=null;
                    //如果應答碼為200的時候,表示成功的請求帶了,這裡的HttpURLConnection.HTTP_OK就是200
                    if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
                        //獲得連線的輸入流
                        inputStream=connection.getInputStream();
                        //轉換成一個加強型的buffered流
                        reader=new BufferedReader(new InputStreamReader(inputStream));
                        //把讀到的內容賦值給result
                        final String result=reader.readLine();
                        //子執行緒不能更新UI執行緒的內容,要更新需要開啟一個Ui執行緒,這裡Toast要在Ui執行緒
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                    //關閉流和連線
                    reader.close();
                    inputStream.close();
                    connection.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
POST請求是看不到URL裡面的標頭檔案內容的,把標頭檔案內容從連線的輸出流中寫入,這樣相對於GET請求會比較安全些
//網路請求是一個耗時操作,要在子執行緒裡面開啟
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //get請求的url
                    URL url=new URL("http://192.168.2.135:8080/web/MyProject");
                    //url寫法:    協議://IP地址:埠號/訪問的檔案
                    //協議一般是http,IP地址是要訪問的IP地址,埠一般是8080,然後加上訪問的是什麼
                    //新建一個HttpURLConnection,從url開啟一個連線
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                    //設定請求的模式
                    connection.setRequestMethod("POST");
                    //設定請求連線超時時間
                    connection.setConnectTimeout(5000);
                    //設定訪問時的超時時間
                    connection.setReadTimeout(5000);
                    //設定連線允許寫入
                    connection.setDoOutput(true);
                    //設定標頭檔案內容
                    String data="username=zhangsan&password=123";
                    //獲得連線的輸出流
                    OutputStream outputStream = connection.getOutputStream();
                    //把標頭檔案內容寫入流中
                    outputStream.write(data.getBytes());
                    //開啟連線
                    connection.connect();
                    InputStream inputStream=null;
                    BufferedReader reader=null;
                    //如果應答碼為200的時候,表示成功的請求帶了,這裡的HttpURLConnection.HTTP_OK就是200
                    if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
                        //獲得連線的輸入流
                        inputStream=connection.getInputStream();
                        //轉換成一個加強型的buffered流
                        reader=new BufferedReader(new InputStreamReader(inputStream));
                        //把讀到的內容賦值給result
                        final String result=reader.readLine();
                        //子執行緒不能更新UI執行緒的內容,要更新需要開啟一個Ui執行緒,這裡Toast要在Ui執行緒
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                    //關閉流和連線
                    reader.close();
                    inputStream.close();
                    connection.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
簡單的下載伺服器圖片的程式碼
new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //建立一個url,指定要下載的圖片的url
                    URL url=new URL("http://192.168.2.135:8080/web/aaa.bmp");
                    //從url開啟連線,下載圖片預設是GET請求
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                    //連線
                    connection.connect();
                    //如果應答碼是200,代表連線上了
                    if(connection.getResponseCode()==200){
                        //從連接獲得輸入流
                        InputStream inputStream=connection.getInputStream();
                        //把輸入流轉成bitmap
                        final Bitmap map= BitmapFactory.decodeStream(inputStream);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //把bitmap設定到控制元件上
                                imageView.setImageBitmap(map);
                            }
                        });
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
簡單的下載某個檔案的程式碼
//設定一個progressdialog
        final ProgressDialog diglog=new ProgressDialog(this);
        //設定diglog的樣式
        diglog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        //設定diglog顯示出來
        diglog.show();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //要下載檔案的url
                    URL url=new URL("http://192.168.2.135:8080/web/mymusic.mp3");
                    //從url開啟連線
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                    //獲得檔案的大小
                    diglog.setMax(connection.getContentLength());
                    //建立連線
                    connection.connect();
                    //設定下載到的地方
                    final File file=new File(Environment.getExternalStorageDirectory(),"/mymusic.mp3");
                    if(connection.getResponseCode()==200){
                        //獲得連線的輸入流
                        InputStream inputStream=connection.getInputStream();
                        //新建一個輸出流
                        FileOutputStream fos=new FileOutputStream(file);
                        //設定每次讀取的內容
                        byte[] bytes=new byte[1024];
                        //設定每次讀取到的內容的長度
                        int len=-1;
                        while ((len=inputStream.read(bytes))!=-1){
                            //把讀到的內容寫入到記憶體裡
                            fos.write(bytes,0,len);
                            //設定diglog每次的增長值
                            diglog.incrementProgressBy(len);
                        }
                        //檔案下載完設定進度條隱藏
                        diglog.dismiss();
                        //關閉流和連線
                        fos.close();
                        inputStream.close();
                    }
                    connection.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

最後要提下注意的幾點

子執行緒是一個耗時操作,不能在子執行緒中更新UI

如果要在子執行緒中更新UI,可以開啟一個UI執行緒,或者使用訊息機制

還要在清單配置檔案那邊加上INTERNET許可權

ProgressDiglog是個特殊的控制元件,可以在子執行緒中來dissmiss掉

下載檔案的時候,注意下載了什麼格式的檔案,下載下來要存到SD卡里的檔案就要是什麼格式

如果要下載很多張圖片,用Bitmap會有OutofMemory(記憶體溢位)風險,

這裡可以使用第三方來解決,比如Blide,Imageloader