Http協定
Http協定是用戶端與服務端通信時的一種非常常用的協定。Http協定主要定義了用戶端與服務端的通信過程與資料包的格式。
短連接配接與長連接配接:
短連接配接:
當連接配接建立完畢後,用戶端發送了請求,服務端傳回響應後,連接配接斷開。
優點:
節省服務端資源。
長連接配接:
用戶端與服務端連接配接建立成功後,在整個通訊過程中連接配接不關閉,持續連接配接。
優點:
維持連接配接可以保證資料通信的實時性。常用于 即時通訊或網絡遊戲等。
Http協定的通訊過程:
Http協定是一款基于短連接配接模式的協定。當請求發送,響應接收後,連接配接斷開。
Http協定中資料包的格式:
請求資料包:
1>請求行(Request Line)
GET .../test_http/get HTTP/1.1
GET:請求方式
.../test_http/get:請求資源路徑
HTTP/1.1 :協定的類型與版本
2>請求消息頭(Request Header)
用于告訴服務端用戶端的狀态及用戶端傳遞請求參數的狀态。
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
3>請求實體(Request Entity)
請求實體主要用于存放在post請求方式下向服務端傳遞的請求參數。
響應資料包:
1>狀态行(Status Line)
HTTP/1.1 200 OK
HTTP/1.1:協定的類型與版本
200: 響應狀态碼(404, 500, 302)
OK: 狀态描述
2>響應消息頭(Response Header)
這些鍵值對用于告訴用戶端服務端的狀态以及服務端傳遞響應資料的狀态
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Sat, 08 Oct 2016 02:30:02 GMT
3>響應實體(Response Entity)
存放服務端傳回給用戶端的具體資料。
比如:XML文檔、普通字元串、圖檔、二進制檔案等
GET請求與POST請求的差別
1>請求參數的存放位置不同。
GET請求:參數存放在請求資源路徑後用?連接配接
POST請求:參數存放在請求資料包的實體部分
2>是否适合傳遞中文參數
GET:不适合
POST:适合
3>是否适合大資料參數的送出
GET:不适合
POST:理論上沒限制
4>安全性
GET:不安全
POST:相對安全
如何使用Android代碼發送HTTP GET請求?
1.建立URL對象
Url url =new Url("http://ip:port/app/path");
2.通過URL對象建立HttpURLConnection對象
HttpURLConnection conn=(強轉) url.openConnection();
3.設定請求方式
conn.setRequsertMethod("GET");
4.發送請求,擷取響應資料包中的輸入流
InputStream is =conn.getInputStream();
5.解析輸入流,擷取響應資料
實作把輸入流中的資料解析為字元串文本。
注意:1.網絡操作必須在工作線程中完成
2.網絡操作需要在清單檔案中注冊權限
android.permission.INTERNET
如何使用Android代碼發送HTTP POST請求?
1.建立URL對象
Url url =new Url("http://xx");
2.擷取HttpURLConnection
HttpURLConnection conn =url.openConnection();
3.設定請求方式為POST
conn.setRequestMethod("POST");
4.設定post請求的消息頭
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
5.設定post請求的請求參數(使用輸出流輸出)
conn.setDoOutput(true);//開啟輸出流
OutPutStream os= conn.getOutputStream();
os.write("date=2018-2-23&from=廣州".getBytes("utf-8"));
os.flush();
6.發送請求,擷取響應輸入流
InputStream is =conn.getInputStream();
7.解析輸入流擷取字元串文本
操作輸入流——>字元串