Web服務(wù)器的工作原理可以簡單地歸納為:
- 客戶機通過TCP/IP協(xié)議建立到服務(wù)器的TCP連接
- 客戶端向服務(wù)器發(fā)送HTTP協(xié)議請求包,請求服務(wù)器里的資源文檔
- 服務(wù)器向客戶機發(fā)送HTTP協(xié)議應(yīng)答包,如果請求的資源包含有動態(tài)語言的內(nèi)容,那么服務(wù)器會調(diào) 用動態(tài)語言的解釋引擎負(fù)責(zé)處理“動態(tài)內(nèi)容”,并將處理得到的數(shù)據(jù)返回給客戶端
- 客戶機與服務(wù)器斷開。由客戶端解釋HTML文檔,在客戶端屏幕上渲染圖形結(jié)果
URL的組成
url是(Uniform Resource Locator)"統(tǒng)一資源定位符"的英文縮寫,用于描述網(wǎng)絡(luò)上的資源,基本格式如下:
scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme 指定低層使用的協(xié)議(例如:http, https, ftp)
host HTTP服務(wù)器的IP地址或者域名
port# HTTP服務(wù)器的默認(rèn)端口是80,這種情況下端口號可以省略。如果使用了別的端口,必
須指明,例如 http://www.cnblogs.com:8080/
path 訪問資源的路徑
query-string 發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor 錨
HTTP請求包和響應(yīng)包
Request包分為3部分
第一部分叫Request line(請求行)
第二部分叫Request header(請求頭)
第三部分是body(主體), header和body之間有個空行
POST http:/test.domain.net/manage/getTask HTTP/1.1 // 此處是請求行, 分別表示:請求方法 請求URI HTT協(xié)議/協(xié)議版本
Host: test.domain.net // 服務(wù)端的主機名
Content-Length: 72
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55 // //瀏覽器信息
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate // //是否支持流壓縮
// 空行,用于分割請求頭和消息體
{"taskStatus":"1","isTabCv":"1","execType":"SQL","pageSize":30,"page":1} // 消息體,請求資源參數(shù),
Response包
Response包中的第一行叫做狀態(tài)行,由HTTP協(xié)議版本號, 狀態(tài)碼, 狀態(tài)消息 三部分組成。
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: application/json;charset=UTF-8
Date: Sun, 06 Dec 2020 07:35:26 GMT //發(fā)送時間
Content-Type: text/html //服務(wù)器發(fā)送信息的類型
Connection: keep-alive //保持連接狀態(tài)
Content-Length: 90 //主體內(nèi)容長度
//空行 用來分割消息頭和主體
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compati... //消息體
狀態(tài)碼告訴我們,http服務(wù)端是否產(chǎn)生的預(yù)期的Response,HTTP協(xié)議中,有如下幾種狀態(tài)碼
- 1XX 提示信息 - 表示請求已被成功接收,繼續(xù)處理
- 2XX 成功 - 表示請求已被成功接收,理解,接受
- 3XX 重定向 - 要完成請求必須進行更進一步的處理
- 4XX 客戶端錯誤 - 請求有語法錯誤或請求無法實現(xiàn)
- 5XX 服務(wù)器端錯誤 - 服務(wù)器未能實現(xiàn)合法的請求
Go搭建一個Web服務(wù)器
Go語言里面提供了net/http標(biāo)準(zhǔn)包,可以很方便的搭建起來一個的Web服務(wù)。同時使用這個包能很簡單地對Web的路 由,靜態(tài)文件,模版,cookie等數(shù)據(jù)進行設(shè)置和操作。
// 設(shè)置訪問的路由
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析參數(shù),默認(rèn)是不會解析的
fmt.Println(r.Form) //這些信息是輸出到服務(wù)器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
fmt.Fprintf(w, "hello word") //這個寫入到w的是輸出到客戶端的
})
// 設(shè)置監(jiān)聽的端口
err := http.ListenAndServe(":7070", nil)
if err != nil {
log.Fatal(err)
}
使用瀏覽器訪問 localhost:7070

1607242061(1).jpg