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