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.解析輸入流獲取字符串文本
操作輸入流——>字符串