golang net/http模塊

golang net/http模塊

搭建網(wǎng)站的歡迎頁面

http.HandleFunc()用于給HTTP服務(wù)注冊(cè)請(qǐng)求處理程序芋类;它接收兩個(gè)參數(shù),一個(gè)是要匹配pattern(通常是uri)沧奴,一個(gè)是用于處理的函數(shù)。

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

func (w http.ResponseWriter, r *http.Request)接收兩個(gè)參數(shù),http.ResponseWriter苛聘,可以把響應(yīng)寫入其中,http.Request包含請(qǐng)求的所有信息忠聚,比如請(qǐng)求uri设哗、請(qǐng)求頭等。

package main

import (
    "fmt"
    "net/http"
)

// 使用golang 的net/http模塊創(chuàng)建簡(jiǎn)易的網(wǎng)站
func main() {
    // HandleFunc用于注冊(cè)請(qǐng)求處理函數(shù)
    // 接收一個(gè)匿名函數(shù)作為參數(shù)两蟀,處理請(qǐng)求和響應(yīng)
    http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
        fmt.Fprintf(writer, "Hello, welcome to access my website: %s. \n", request.URL.Path)
    })

    // 監(jiān)聽端口网梢,把請(qǐng)求傳遞給請(qǐng)求處理程序
    http.ListenAndServe(":8080", nil)
}

上面的請(qǐng)求就搭建了一個(gè)網(wǎng)站的歡迎頁面,在瀏覽器中訪問http://localhost:8080/hello時(shí)赂毯,請(qǐng)求處理程序會(huì)把歡迎的語句打印到響應(yīng)頁面中战虏。

圖片.png

HTTP Server的基本能力

一個(gè)基本的http server需要以下幾個(gè)功能:

  • 處理動(dòng)態(tài)請(qǐng)求:用戶瀏覽網(wǎng)站時(shí)發(fā)起的各種請(qǐng)求,如登錄党涕、下載圖片

  • 靜態(tài)資源服務(wù):向?yàn)g覽器提供靜態(tài)的 JavaScript烦感、 CSS 和圖像服務(wù),為用戶創(chuàng)建動(dòng)態(tài)體驗(yàn)

  • 接收連接:http server必須要監(jiān)聽在某一個(gè)端口上膛堤,接收所有發(fā)起請(qǐng)求的連接

處理動(dòng)態(tài)請(qǐng)求

第一節(jié)中歡迎頁面的示例其實(shí)就屬于動(dòng)態(tài)的請(qǐng)求手趣,用戶訪問指定的uri,http server作出相應(yīng)的相應(yīng)肥荔。此外由于請(qǐng)求處理函數(shù)接收的`http.Requset`參數(shù)包含所有請(qǐng)求的所有信息绿渣,http server也可以處理請(qǐng)求中的相關(guān)參數(shù)。

例如我在第一節(jié)中的代碼新注冊(cè)一個(gè)整型數(shù)字加法的功能次企,通過`r.URL.Query().Get("param")`可以獲取GET請(qǐng)求URL中的參數(shù)怯晕。
http.HandleFunc("/calc", func(w http.ResponseWriter, r *http.Request) {
        a := r.URL.Query().Get("a")
        b := r.URL.Query().Get("b")
        inta, err := strconv.Atoi(a)
        if err != nil {
            fmt.Fprintf(w, "param a is not a int number!\n")
            panic(err)
        }
        intb, err := strconv.Atoi(b)
        if err != nil {
            fmt.Fprintf(w, "param b is not a int number!\n")
            panic(err)
        }
        fmt.Fprintf(w, "plus two integer:\n")
        fmt.Fprintf(w, "a + b = %v \n", inta+intb)
    })
2022-08-13-13-53-01-image.png

靜態(tài)資源服務(wù)

靜態(tài)資源通常是html、css缸棵、js舟茶、圖片等文件。它們通常存放在web服務(wù)的某一個(gè)目錄堵第,一般叫/public或/static吧凉。net/http模塊內(nèi)置的http.FileServer()方法可以指定FileSystem的路徑作為請(qǐng)求目錄的根路徑并返回一個(gè)處理程序。http.Dir()把指定的路徑封裝成FileSytem對(duì)象并傳入http.FileServer()踏志。

在main.go的同級(jí)目錄下創(chuàng)建一個(gè)web文件夾阀捅,用于存放各類靜態(tài)資源,在web目錄下創(chuàng)建一個(gè)public文件夾存放html資源针余,目錄結(jié)構(gòu)如下:

-main.go
-web
-public
-index.html

注冊(cè)靜態(tài)資源服務(wù)的處理程序饲鄙,并構(gòu)造一個(gè)index.html頁面:

    // 為js凄诞、css、html忍级、圖片等靜態(tài)資源服務(wù)
    welcomepage := http.FileServer(http.Dir("path/web/public/"))
    http.Handle("/", welcomepage)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>htmlAsset</title>
</head>
<body>
    <h2>welcome to the html page.</h2>
    <p>this is a static asset.</p>
</body>
</html>

重啟http server后在瀏覽器中訪問http://localhost:8080/index.html帆谍,用戶即可與靜態(tài)資源交互。

2022-08-13-14-51-32-image.png

當(dāng)然js等靜態(tài)資源同樣能訪問轴咱,創(chuàng)建一個(gè)calculator.html:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>myCalculator</title>
</head>
<style>
    .box {
        width: 400px;
        height: 100px;
        background: #00ffff;
        position: absolute;
        left: 50%;
        margin-left: -100px;
    }
</style>
<body>
<div class="box">
    <input type="text" id="inta" value=""/>
    +
    <input type="text" id="intb" value="" />
    =
    <input type="text" id="plus" value="">
    </br>
    <input type="button" name="calc-plus" value=" 計(jì)算 " onclick="calc()" >
</div>
</body>
<script type="text/javascript">
    function calc() {
        var num1 = parseInt(document.getElementById("inta").value);
        var num2 = parseInt(document.getElementById("intb").value);
        document.getElementById("plus").value = num1+num2;
    }
</script>
</html>
2022-08-13-15-24-09-image.png

接收連接

完成簡(jiǎn)易http server的最后一步就是監(jiān)聽端口接受所有來自互聯(lián)網(wǎng)上的連接(請(qǐng)求)汛蝙。當(dāng)然也如前面的示例一樣,通過http.ListenAndServe實(shí)現(xiàn)朴肺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窖剑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子戈稿,更是在濱河造成了極大的恐慌西土,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器瘪,死亡現(xiàn)場(chǎng)離奇詭異翠储,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)橡疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門援所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欣除,你說我怎么就攤上這事住拭。” “怎么了历帚?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵滔岳,是天一觀的道長。 經(jīng)常有香客問我挽牢,道長谱煤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任禽拔,我火速辦了婚禮刘离,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘睹栖。我一直安慰自己硫惕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布野来。 她就那樣靜靜地躺著恼除,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曼氛。 梳的紋絲不亂的頭發(fā)上豁辉,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天令野,我揣著相機(jī)與錄音,去河邊找鬼秋忙。 笑死彩掐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灰追。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼狗超,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼弹澎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起努咐,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤苦蒿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后渗稍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佩迟,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年竿屹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了报强。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拱燃,死狀恐怖秉溉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碗誉,我是刑警寧澤召嘶,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站哮缺,受9級(jí)特大地震影響弄跌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尝苇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一铛只、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茎匠,春花似錦格仲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汽馋,卻和暖如春侮东,著一層夾襖步出監(jiān)牢的瞬間圈盔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工悄雅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驱敲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓宽闲,卻偏偏與公主長得像众眨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子容诬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容