使用Go搭建一個Web服務(wù)器

Web服務(wù)器的工作原理可以簡單地歸納為:

  1. 客戶機通過TCP/IP協(xié)議建立到服務(wù)器的TCP連接
  2. 客戶端向服務(wù)器發(fā)送HTTP協(xié)議請求包,請求服務(wù)器里的資源文檔
  3. 服務(wù)器向客戶機發(fā)送HTTP協(xié)議應(yīng)答包,如果請求的資源包含有動態(tài)語言的內(nèi)容,那么服務(wù)器會調(diào) 用動態(tài)語言的解釋引擎負(fù)責(zé)處理“動態(tài)內(nèi)容”,并將處理得到的數(shù)據(jù)返回給客戶端
  4. 客戶機與服務(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部分

  1. 第一部分叫Request line(請求行)

  2. 第二部分叫Request header(請求頭)

  3. 第三部分是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)碼

  1. 1XX 提示信息 - 表示請求已被成功接收,繼續(xù)處理
  2. 2XX 成功 - 表示請求已被成功接收,理解,接受
  3. 3XX 重定向 - 要完成請求必須進行更進一步的處理
  4. 4XX 客戶端錯誤 - 請求有語法錯誤或請求無法實現(xiàn)
  5. 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容