2--安卓網路程式設計之http協議簡介+小案例引入
零、前言
1.初衷
安卓一大堆網路框架,會用倒是會用,但總覺得封裝得太多,就太表象了,這讓我看不清網路的內在。
就像買了一份拼圖,買來就是拼好的,我還不知道碎片是什麼樣子的,這樣放著不管就可以了嗎?真的不想自己拼一拼?
為了更清晰的認識網路,打算從起點來看一下安卓的安卓網路程式設計
2.本文測試的url為已在伺服器上,可訪問:
訪問返回Json地址: ofollow,noindex">http://www.toly1994.com:8089/swords/find/21
訪問返回圖片地址: http://www.toly1994.com:8080/imgs/logo/BroadcastReceiver.jpg
具體url的建立方法可詳見: SpringBoot篇:SpringBoot-07-之資料庫JPA(CRUD)
一、HTTP----超文字傳輸協議(HyperText Transfer Protocol)
1.HTTP一種基於TCP/IP協議的網路傳輸協議。
2.HTTP用於 服務端
傳輸超文字到 客戶端
,是一種應用層的傳輸協議。
HTTP協議工作於 客戶端/服務端架構(B/S架構)
上:
客戶端
通過 URL(統一資源定位符)
向 WEB伺服器
傳送請求, WEB伺服器
根據請求,向 客戶端
傳送響應資訊
WEB伺服器:Apache伺服器,IIS伺服器、Tomcat、Nginx、Jetty等
客戶端:瀏覽器、聯網的App、遊戲客戶端等
1.http請求測試:

http請求.png
請求頭:瀏覽器傳送給伺服器
#請求行:使用HTTP/1.1協議傳送GET方式請求,訪問域名下的/swords/find/21資源 GET /swords/find/21 HTTP/1.1 #請求的域名和埠 Host: localhost:8080 #維持長連線 Connection: keep-alive Pragma: no-cache #瀏覽器快取型別 Cache-Control: no-cache Upgrade-Insecure-Requests: 1 #瀏覽器的廠商資訊 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 #瀏覽器可接收的資料型別: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 #宣告瀏覽器支援的編碼型別 Accept-Encoding: gzip, deflate, br #宣告瀏覽器支援的語言 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
2.響應頭:伺服器傳送給瀏覽器
#返回內容型別 Content-Type: application/json;charset=UTF-8 #時間 Date: Mon, 15 Oct 2018 00:26:33 GMT #分塊編碼 Transfer-Encoding: chunked
3.響應體
{"id":21, "name":"Excalibur", "info":"Excalibur是傳說中不列顛國王亞瑟王從湖之仙女那得到的聖劍。 此劍在是精靈在阿瓦隆(Avalon)所打造,劍鍔由黃金所鑄、劍柄上鑲有寶石,並因其鋒刃削鐵如泥", "imgurl":"http://localhost:8080/imgs/timg.jpg", "create_time":"2018-07-17T08:29:36.000+0000", "modify_time":"2018-07-17T08:29:36.000+0000", "origin":"亞瑟王"}

http請求測試.png
二、請求網路並接收伺服器返回的資料
新增網路訪問許可權
<uses-permission android:name="android.permission.INTERNET"/>
使用安卓原生網路API請求網路大致步驟:
1.建立URL物件url: new URL(String path)
2.使用url連線並獲取HttpURLConnection物件conn: url.openConnection()
3.為conn物件設定請求資訊: conn.setXXX()
4.校驗響應碼,200代表請求成功: conn.getResponseCode()
5.通過conn獲取伺服器傳來的輸入流: conn.getInputStream()
6.對流進行操作:java的基礎----IO流
1.點選按鈕是執行程式碼:
注意需要新開執行緒執行請求網路,不然異常: android.os.NetworkOnMainThreadException
String path = "http://192.168.43.60:8080/swords/find/21"; //新開執行緒訪問網路 new Thread(() -> { String result = getRes(path); Log.e(TAG, "onViewClicked: " + result); }).start();
2.請求網路核心程式碼:
/** * 通過url訪問伺服器,並接收伺服器響應資料 * * @param path url */ private String getRes(String path) { InputStream is = null; try { //1.建立URL物件url URL url = new URL(path); //2.使用url連線並獲取HttpURLConnection物件conn HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //3.為conn物件設定請求資訊 conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); //4.校驗響應碼,200代表請求成功 if (conn.getResponseCode() == 200) { //5.通過conn獲取伺服器傳來的輸入流 is = conn.getInputStream(); //6.對流進行操作 StringBuilder sb = new StringBuilder(); int len = 0; byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1) { sb.append(new String(buf, 0, len)); } return sb.toString(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } return "error"; }

安卓請求網路.png
3.引申:可以通過輸入網址來獲取不同的返回值,並用TextView顯示,如:

引申.png
你也可以請求一下百度的伺服器,可以看出是返回了一個Html的原始碼,瀏覽器便是解析這份原始碼,渲染成檢視展現出來的。

請求百度首頁.png
三、請求網路,載入圖片
可見請求一個url時,伺服器會返回一個位元組流,圖片也是二進位制,當然也能順著伺服器 流
過來。
按照上面的例項,看看流過來的是什麼?圖片地址: http://www.toly1994.com:8080/imgs/logo/BroadcastReceiver.jpg
不出所料,是亂碼,但能讀出來就成功了一半

網路圖片文字顯示.png
顯示圖片
核心在於流的使用:通過流建立Bitmap物件: BitmapFactory.decodeStream(InputStream is)
1.點選按鈕是執行程式碼:
new Thread(() -> { Bitmap img = decodeImg(mIdEtUrl.getText().toString()); runOnUiThread(() -> { mIdIvImg.setImageBitmap(img); }); }).start();
2.請求網路核心程式碼:
/** * 通過url返回一個Bitmap * @param path url * @return 圖片 */ private Bitmap decodeImg(String path) { InputStream is = null; OutputStream os = null; try { //1.建立URL物件url URL url = new URL(path); //2.使用url連線並獲取HttpURLConnection物件conn HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //3.為conn物件設定請求資訊 conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); //4.校驗響應碼,200代表請求成功 if (conn.getResponseCode() == 200) { //5.通過conn獲取伺服器傳來的輸入流 is = conn.getInputStream(); //6.對流進行操作 return BitmapFactory.decodeStream(is); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; }

網路圖片.png
後記:捷文規範
1.本文成長記錄及勘誤表
專案原始碼 | 日期 | 備註 |
---|---|---|
V0.1--無 | 2018-10-15 | 2--安卓網路程式設計之http協議簡介+小案例引入 |
2.更多關於我
筆名 | 微信 | 愛好 | |
---|---|---|---|
張風捷特烈 | 1981462002 | zdl1994328 | 語言 |
我的github | 我的簡書 | 我的CSDN | 個人網站 |
3.宣告
1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大程式設計愛好者共同交流
3----個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
4----看到這裡,我在此感謝你的喜歡與支援