Go入門(mén)系列(十一)WEB

目錄
一诡蜓、服務(wù)端
二烫饼、客戶(hù)端

一猎塞、服務(wù)端

什么是Web的服務(wù)端?個(gè)人理解:網(wǎng)站杠纵,API等荠耽。
Go語(yǔ)言里面提供了一個(gè)完善的net/http包,通過(guò)http包可以很方便的就搭建起來(lái)一個(gè)可以運(yùn)行的Web服務(wù)比藻。同時(shí)使用這個(gè)包能很簡(jiǎn)單地對(duì)Web的路由铝量,靜態(tài)文件,模版银亲,cookie等數(shù)據(jù)進(jìn)行設(shè)置和操作慢叨。
拉起一個(gè)http服務(wù)僅需要簡(jiǎn)單的幾行,定義路由务蝠,定義方法即可:

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", hello) //設(shè)置訪問(wèn)的路由
    err := http.ListenAndServe(":8080", nil) //設(shè)置監(jiān)聽(tīng)的端口
    checkErr(err)
}

func checkErr(err error) {
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}

···
我們嘗試增加簡(jiǎn)單的傳參交互:

func hello(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    if len(r.Form["name"])>0 {
        fmt.Fprintf(w, "Hello %s",r.Form["name"][0])
    }else {
        fmt.Fprintf(w, "WHo are u?")
    }
}

Golang Web開(kāi)源框架已經(jīng)逐漸興起拍谐,感興趣的小伙伴可以自行了解。因?yàn)閷?duì)于本章節(jié)來(lái)講此非重點(diǎn)馏段,所以我們?cè)谶@里僅進(jìn)行簡(jiǎn)單的web服務(wù)功能介紹轩拨。

二、客戶(hù)端

Web客戶(hù)端院喜,如B/S架構(gòu)的瀏覽器亡蓉,而對(duì)于滲透行業(yè)的需求,爬蟲(chóng)喷舀,yes砍濒!
借助http包實(shí)現(xiàn)一個(gè)最基本的例子淋肾,以剛剛搭建的服務(wù)端為例,發(fā)起get請(qǐng)求:

func main() {
    resp, err := http.Get("http://127.0.0.1:8080")
    checkErr(err)
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

簡(jiǎn)單的http請(qǐng)求可以借助http來(lái)實(shí)現(xiàn)梯影,但是更多的請(qǐng)求是需要校驗(yàn)header頭的巫员。
所以我們?nèi)绻枰O(shè)置其它參數(shù),就需要用到其組件了甲棍。

  • Client
    基本用法的話和http十分相似:
func main() {
    client := &http.Client{}
    resp, err := client.Get("http://127.0.0.1:8080")
    checkErr(err)
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

我們可以進(jìn)入該組件查看其功能简识,分別對(duì)應(yīng)連接壽命管理,重定向控制感猛,cookie對(duì)象管理和超時(shí)設(shè)置七扰。

type Client struct {
    Transport RoundTripper
    CheckRedirect func(req *Request, via []*Request) error
    Jar CookieJar
    Timeout time.Duration
}

但是,該組件依然不能滿(mǎn)足我們對(duì)header頭的苛刻設(shè)置陪白。

  • Request
    http提供了NewRequest方法來(lái)生成Request颈走,此方法中做了一些生成Request的默認(rèn)設(shè)置,函數(shù)簽名為:
func NewRequest(method, url string, body io.Reader) (*Request, error)

參數(shù)中method和url兩個(gè)是必備參數(shù)咱士,而body參數(shù)立由,在使用沒(méi)有body的請(qǐng)求方法時(shí),傳入nil即可序厉。
設(shè)置完成后锐膜,借助client組建的Do()方法執(zhí)行。

req, err := NewRequest("GET", "https://127.0.0.1:8080", nil)
resp, err := client.Do(req)

寫(xiě)到這里的時(shí)候弛房,我他喵心疼已經(jīng)崩了道盏,python他不香嘛,requests庫(kù)簡(jiǎn)直強(qiáng)無(wú)敵文捶。
emmmm荷逞,綜合對(duì)比一下,go語(yǔ)言的爬蟲(chóng)代碼量和代碼難度(或者是設(shè)置項(xiàng)之多)可能要比python多個(gè)幾倍不止粹排,尤其是Go語(yǔ)言的數(shù)據(jù)處理也比python相對(duì)復(fù)雜种远。優(yōu)點(diǎn)嘛,其并發(fā)機(jī)制決定著go的性能會(huì)更高顽耳,此外坠敷,go還有一點(diǎn)就是編譯為二進(jìn)制文件的穩(wěn)定性斧抱,這個(gè)絕非python可以比擬的渐溶。
如果個(gè)人看法的話辉浦,非編程專(zhuān)業(yè)寫(xiě)爬蟲(chóng)還是python吧茎辐,當(dāng)然也包括我宪郊,至少目前的態(tài)度是這樣的掂恕。

更多更詳細(xì)的設(shè)置這里安利一篇比較棒的文章:http://www.reibang.com/p/4e53d4727152

既然學(xué)都學(xué)了弛槐,我們嘗試完成一個(gè)小任務(wù)懊亡,完成一個(gè)疫情實(shí)時(shí)監(jiān)控小程序乎串!
api的話店枣,尋找一個(gè)實(shí)時(shí)更新的web界面即可,如:https://voice.baidu.com/act/newpneumonia/newpneumonia

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://voice.baidu.com/act/newpneumonia/newpneumonia", nil)
    checkErr(err)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0")
    req.AddCookie(&http.Cookie{Name: "BAIDUID",Value: "00A1B1EC9FF50D09E8740C2BB49A2120"})
    resp, err := client.Do(req)
    checkErr(err)
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    summaryDataIn := regexp.MustCompile(`"summaryDataIn":{.*?}`).FindAllStringSubmatch(string(body), -1)[0][0]
    fmt.Println("【疫情實(shí)時(shí)報(bào)告】")
    fmt.Println("現(xiàn)有確診:",regexp.MustCompile(`"curConfirm":"(.*?)"`).FindAllStringSubmatch(summaryDataIn, -1)[0][1])
    fmt.Println("現(xiàn)有疑似:",regexp.MustCompile(`"unconfirmed":"(.*?)"`).FindAllStringSubmatch(summaryDataIn, -1)[0][1])
    fmt.Println("現(xiàn)有重癥:",regexp.MustCompile(`"icu":"(.*?)"`).FindAllStringSubmatch(summaryDataIn, -1)[0][1])
    fmt.Println("累計(jì)治愈:",regexp.MustCompile(`"cured":"(.*?)"`).FindAllStringSubmatch(summaryDataIn, -1)[0][1])
    fmt.Println("累計(jì)死亡:",regexp.MustCompile(`"died":"(.*?)"`).FindAllStringSubmatch(summaryDataIn, -1)[0][1])
    fmt.Println("累計(jì)確診:",regexp.MustCompile(`"confirmed":"(.*?)"`).FindAllStringSubmatch(summaryDataIn, -1)[0][1])
    fmt.Println("更新時(shí)間:",time.Now().Format("2006-01-02 15:04:05"))

}

func checkErr(err error) {
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}

我們將源碼編譯為二進(jìn)制文件叹誉,運(yùn)行效果如下:

END

日常吐槽時(shí)間到,撇開(kāi)爬蟲(chóng)功能的優(yōu)劣钧唐,我想說(shuō)的是我從沒(méi)想拿Golang替代python匠襟,但是它相對(duì)簡(jiǎn)單的語(yǔ)法高效的性能,至少在WEB滲透方向的需求里酸舍,它在一定程度上可以替代C/C艸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末父腕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萧诫,更是在濱河造成了極大的恐慌枝嘶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件及刻,死亡現(xiàn)場(chǎng)離奇詭異竞阐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)骆莹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丢氢,“玉大人,你說(shuō)我怎么就攤上這事疚察。” “怎么了貌嫡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵岛抄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我弦撩,道長(zhǎng),這世上最難降的妖魔是什么猾漫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任感凤,我火速辦了婚禮,結(jié)果婚禮上陪竿,老公的妹妹穿的比我還像新娘。我一直安慰自己闰挡,他們只是感情好礁哄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著桐绒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咧叭。 梳的紋絲不亂的頭發(fā)上烁竭,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音生均,去河邊找鬼。 笑死马胧,一個(gè)胖子當(dāng)著我的面吹牛衔峰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垫卤,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼穴肘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了评抚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤邢笙,失蹤者是張志新(化名)和其女友劉穎侍匙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體想暗,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年铛纬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唬滑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡擒悬,死狀恐怖稻艰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤畜侦,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布躯保,位于F島的核電站,受9級(jí)特大地震影響途事,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尸变,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一召烂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奏夫,春花似錦、人聲如沸桶蛔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碟婆。三九已至,卻和暖如春竖共,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背公给。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工淌铐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腿准。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像街望,于是被迫代替她去往敵國(guó)和親校翔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灾前,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • Python語(yǔ)言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個(gè)如下例子豫柬,分析運(yùn)行結(jié)果: 代碼一: a = 1 def...
    時(shí)光清淺03閱讀 480評(píng)論 0 0
  • Python語(yǔ)言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個(gè)如下例子扑浸,分析運(yùn)行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,050評(píng)論 0 15
  • 沙溪古鎮(zhèn) 青瓦白墻證古今,一條玉河流入心础嫡; 庯峭霓虹映紅顏酝惧,臨水傲立天地間榴鼎; 穹宇妒羨君之顏晚唇,偷入水中見(jiàn)君顏; 試...
    隨筆詩(shī)文閱讀 231評(píng)論 0 1
  • 草長(zhǎng)鶯飛平项,柳綠花紅,一眨眼就又要步入盛夏闽瓢。去年的這個(gè)時(shí)候心赶,我還滿(mǎn)懷希望和夢(mèng)想扣讼,沒(méi)有高考的我缨叫,未來(lái)還有無(wú)限的可能。身...
    奈何歌閱讀 721評(píng)論 1 4
  • 最近在用手機(jī)看一些電子書(shū)艰山,本來(lái)對(duì)自己的理解能力很是認(rèn)可咏闪,這兩周看的一本書(shū)卻對(duì)自己的閱讀吸收水平產(chǎn)生了懷疑曙搬。 某公共...
    青兒姑娘閱讀 141評(píng)論 0 0