W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
我們之前介紹的 Http 協(xié)議和 WebSocket 協(xié)議都屬于應(yīng)用層協(xié)議,除了它們,應(yīng)用層協(xié)議還有很多如:SMTP、FTP 等,這些應(yīng)用層協(xié)議的實(shí)現(xiàn)都是通過 Socket API 來實(shí)現(xiàn)的。其實(shí),操作系統(tǒng)中提供的原生網(wǎng)絡(luò)請求 API 是標(biāo)準(zhǔn)的,在 C 語言的 Socket 庫中,它主要提供了端到端建立鏈接和發(fā)送數(shù)據(jù)的基礎(chǔ) API,而高級編程語言中的 Socket 庫其實(shí)都是對操作系統(tǒng)的 socket API 的一個封裝。所以,如果我們需要自定義協(xié)議或者想直接來控制管理網(wǎng)絡(luò)鏈接、又或者我們覺得自帶的 HttpClient 不好用想重新實(shí)現(xiàn)一個,這時我們就需要使用 Socket。Flutter 的 Socket API 在 dart:io 包中,下面我們看一個使用 Socket 實(shí)現(xiàn)簡單 http 請求的示例,以請求百度首頁為例:
_request() async{
//建立連接
var socket=await Socket.connect("baidu.com", 80);
//根據(jù)http協(xié)議,發(fā)送請求頭
socket.writeln("GET / HTTP/1.1");
socket.writeln("Host:baidu.com");
socket.writeln("Connection:close");
socket.writeln();
await socket.flush(); //發(fā)送
//讀取返回內(nèi)容
_response =await socket.transform(utf8.decoder).join();
await socket.close();
}
可以看到,使用 Socket 需要我們自己實(shí)現(xiàn) Http 協(xié)議(需要自己實(shí)現(xiàn)和服務(wù)器的通信過程),本例只是一個簡單示例,沒有處理重定向、cookie 等。本示例完整代碼參考示例 demo,運(yùn)行后效果如圖11-2所示:
可以看到響應(yīng)內(nèi)容分兩個部分,第一部分是響應(yīng)頭,第二部分是響應(yīng)體,服務(wù)端可以根據(jù)請求信息動態(tài)來輸出響應(yīng)體。由于本示例請求頭比較簡單,所以響應(yīng)體和瀏覽器中訪問的會有差別,讀者可以補(bǔ)充一些請求頭(如user-agent)來看看輸出的變化。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: