国产亚洲欧美人成在线,免费视频爱爱太爽了无码,日本免费一区二区三区高清视频 ,国产真实伦对白精彩视频

歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
電話(huà)圖標(biāo) 余先生:13699882642

網(wǎng)站百科

為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴

一文讀懂Go的net/http標(biāo)準(zhǔn)庫(kù)

發(fā)表日期:2017-12 文章編輯:小燈 瀏覽次數(shù):3521


點(diǎn)擊標(biāo)題下「異步圖書(shū)」可快速關(guān)注

京東質(zhì)量測(cè)試技術(shù)論壇將于12.16日在人民郵電出版

點(diǎn)擊標(biāo)題下「異步圖書(shū)」可快速關(guān)注

京東質(zhì)量測(cè)試技術(shù)論壇將于12.16日在人民郵電出版


點(diǎn)擊標(biāo)題下「異步圖書(shū)」可快速關(guān)注

對(duì)推廣運(yùn)營(yíng)同學(xué)而言,如果用一個(gè)詞來(lái)代表Web時(shí)代的話(huà),那一定是“百度”。這個(gè)時(shí)代,百度牢牢占據(jù)互聯(lián)網(wǎng)流量入

點(diǎn)擊標(biāo)題下「異步圖書(shū)」可快速關(guān)注

對(duì)推廣運(yùn)

點(diǎn)擊標(biāo)題下「異步圖書(shū)」可快速關(guān)注

對(duì)推廣運(yùn)

點(diǎn)擊標(biāo)題下「異步圖書(shū)」可快速關(guān)注 

在進(jìn)行Web應(yīng)用開(kāi)發(fā)的時(shí)候,使用成熟并且復(fù)雜的Web應(yīng)用框架通常會(huì)使開(kāi)發(fā)變得更加迅速和簡(jiǎn)便,但這也意味著開(kāi)發(fā)者必須接受框架自身的一套約定和模式。雖然很多框架都認(rèn)為自己提供的約定和模式是最佳實(shí)踐(best practice),但是如果開(kāi)發(fā)者沒(méi)有正確地理解這些最佳實(shí)踐,那么對(duì)最佳實(shí)踐的應(yīng)用就可能會(huì)發(fā)展為貨物崇拜編程(cargo cult programming):開(kāi)發(fā)者如果不了解這些約定和模式的用法,就可能會(huì)在不必要甚至有害的情況下盲目地使用它們。

貨物崇拜編程

第二次世界大戰(zhàn)期間,盟軍為了對(duì)戰(zhàn)事提供支援,在太平洋的多個(gè)島嶼上設(shè)立了空軍基地,以空投的方式向部隊(duì)以及支援部隊(duì)的島民投送了大量生活用品以及軍事設(shè)備,從而極大地改善了部隊(duì)以及島民的生活,島民也因此第一次看到了人工生產(chǎn)的衣物、罐頭食品以及其他物品。在戰(zhàn)爭(zhēng)結(jié)束之后,這些空軍基地便被廢棄了,貨物空投自然也停止了。此時(shí),島民做了一件非常符合其本性的事情——他們把自己打扮成空管員、士兵以及水手,使用機(jī)場(chǎng)上的指揮棒揮舞著著陸信號(hào),進(jìn)行地面閱兵演習(xí),試圖讓飛機(jī)繼續(xù)空投貨物,貨物崇拜一詞也因此而誕生。

盡管貨物崇拜程序員并沒(méi)有像島民一樣揮舞指揮棒,但他們卻大量地復(fù)制和粘貼從StackOverflow這類(lèi)網(wǎng)站上找來(lái)的代碼,這些代碼雖然能夠運(yùn)行,但是他們卻對(duì)這些代碼的工作原理一點(diǎn)也不了解。這樣做的結(jié)果是,他們通常無(wú)法擴(kuò)展和修改這些代碼。與此類(lèi)似,貨物崇拜程序員通常會(huì)在既不了解框架為什么使用特定的模式或約定,也不知道框架做了何種取舍的情況下,盲目地使用Web框架。

舉個(gè)例子來(lái)說(shuō),因?yàn)镠TTP是一種無(wú)連接協(xié)議(connection-less protocol),通過(guò)這種協(xié)議發(fā)送給服務(wù)器的請(qǐng)求對(duì)服務(wù)器之前處理過(guò)的請(qǐng)求一無(wú)所知,所以應(yīng)用程序才會(huì)以cookie的方式在客戶(hù)端實(shí)現(xiàn)數(shù)據(jù)持久化,并以會(huì)話(huà)的方式在服務(wù)器上實(shí)現(xiàn)數(shù)據(jù)持久化,而不了解這一點(diǎn)的人是很難理解為什么要在不同連接之間使用cookie和會(huì)話(huà)實(shí)現(xiàn)信息持久化的。為了降低使用cookie和會(huì)話(huà)帶來(lái)的復(fù)雜性,Web應(yīng)用框架通常都會(huì)提供一個(gè)統(tǒng)一的接口(uniform interface),用于在連接之間實(shí)現(xiàn)持久化。這樣做的結(jié)果是,很多新手程序員都會(huì)想當(dāng)然地假設(shè)在連接之間進(jìn)行持久化唯一要做的就是使用框架提供的接口。但是由于這類(lèi)接口通常都是根據(jù)框架自身的習(xí)慣制定的,因此不同框架提供的接口可能會(huì)有所不同。更糟糕的是,不同的框架可能會(huì)提供一些名字相同的接口,但是這些同名接口之間的實(shí)現(xiàn)卻又千差萬(wàn)別、各不相同,因此給開(kāi)發(fā)者帶來(lái)不必要的困惑。通過(guò)這個(gè)例子可以看出,使用框架進(jìn)行Web應(yīng)用開(kāi)發(fā)意味著將框架與應(yīng)用進(jìn)行綁定,之后無(wú)論是將應(yīng)用遷移至另一個(gè)框架,還是對(duì)應(yīng)用進(jìn)行擴(kuò)展,又或者為應(yīng)用添加新的特性,都需要對(duì)框架本身有深入的了解,在某些情況下可能還需要對(duì)框架進(jìn)行定制。

本文的目的并不是讓大家拋棄框架、約定和模式——一個(gè)好的框架通常是快速構(gòu)建可擴(kuò)展且健壯的Web應(yīng)用的最好方法,但理解那些隱藏在框架之下的底層概念和基礎(chǔ)設(shè)施也是非常重要的。只要對(duì)框架的實(shí)現(xiàn)原理有了正確的認(rèn)識(shí),我們就可以更加清晰地了解到這些約定和模式是如何形成的,從而避免陷阱、理清思路,不再盲目地使用模式。

對(duì)Go語(yǔ)言來(lái)說(shuō),隱藏在框架之下的通常是net/httphtml/template這兩個(gè)標(biāo)準(zhǔn)庫(kù),如圖1所示,net/http標(biāo)準(zhǔn)庫(kù)可以分為客戶(hù)端和服務(wù)器兩個(gè)部分,庫(kù)中的結(jié)構(gòu)和函數(shù)有些只支持客戶(hù)端和服務(wù)器這兩者中的一個(gè),而有些則同時(shí)支持客戶(hù)端和服務(wù)器:

  • Client、Response、HeaderRequestCookie對(duì)客戶(hù)端進(jìn)行支持;

  • ServerServeMux、Handler/HandleFuncResponseWriter、HeaderRequestCookie則對(duì)服務(wù)器進(jìn)行支持。

本文接下來(lái)將會(huì)展示如何把net/http標(biāo)準(zhǔn)庫(kù)用作服務(wù)器以及如何使用Go語(yǔ)言接收客戶(hù)端發(fā)送的HTTP請(qǐng)求。在之后的第4章,我們還會(huì)繼續(xù)使用net/http標(biāo)準(zhǔn)庫(kù),但焦點(diǎn)會(huì)放在如何處理請(qǐng)求上面。

在Go Web編程中,我們主要關(guān)注的是如何使用net/http標(biāo)準(zhǔn)庫(kù)的服務(wù)器功能而非客戶(hù)端功能。

圖1 net/http標(biāo)準(zhǔn)庫(kù)的各個(gè)組成部分

使用Go構(gòu)建服務(wù)器

如圖2所示,通過(guò)net/http標(biāo)準(zhǔn)庫(kù),我們可以啟動(dòng)一個(gè)HTTP服務(wù)器,然后讓這個(gè)服務(wù)器接收請(qǐng)求并向請(qǐng)求返回響應(yīng)。除此之外,net/http標(biāo)準(zhǔn)庫(kù)還提供了一個(gè)連接多路復(fù)用器(multiplexer)的接口以及一個(gè)默認(rèn)的多路復(fù)用器。

圖2 通過(guò)Go服務(wù)器處理請(qǐng)求

Go Web服務(wù)器

跟其他編程語(yǔ)言里面的絕大多數(shù)標(biāo)準(zhǔn)庫(kù)不一樣,Go提供了一系列用于創(chuàng)建Web服務(wù)器的標(biāo)準(zhǔn)庫(kù)。正如代碼清單3-1所示,創(chuàng)建一個(gè)服務(wù)器的步驟非常簡(jiǎn)單,只要調(diào)用ListenAndServe并傳入網(wǎng)絡(luò)地址以及負(fù)責(zé)處理請(qǐng)求的處理器(handler)作為參數(shù)就可以了。如果網(wǎng)絡(luò)地址參數(shù)為空字符串,那么服務(wù)器默認(rèn)使用80端口進(jìn)行網(wǎng)絡(luò)連接;如果處理器參數(shù)為nil,那么服務(wù)器將使用默認(rèn)的多路復(fù)用器DefaultServeMux

代碼清單3-1 最簡(jiǎn)單的Web服務(wù)器

package main

import (

   "net/http"

)

func main() {

   http.ListenAndServe("", nil)

}

用戶(hù)除了可以通過(guò)ListenAndServe的參數(shù)對(duì)服務(wù)器的網(wǎng)絡(luò)地址和處理器進(jìn)行配置之外,還可以通過(guò)Server結(jié)構(gòu)對(duì)服務(wù)器進(jìn)行更詳細(xì)的配置,其中包括為請(qǐng)求讀取操作設(shè)置超時(shí)時(shí)間、為響應(yīng)寫(xiě)入操作設(shè)置超時(shí)時(shí)間以及為Server結(jié)構(gòu)設(shè)置錯(cuò)誤日志記錄器等。

代碼清單3-2和代碼清單3-1的作用基本上是相同的,它們之間的唯一區(qū)別在于代碼清單3-2可以通過(guò)Server結(jié)構(gòu)對(duì)服務(wù)器進(jìn)行更多的配置。

代碼清單3-2 帶有附加配置的Web服務(wù)器

package main


import (

  "net/http"

)


func main() {

  server := http.Server{

    Addr:  "127.0.0.1:8080",

    Handler: nil,

  }

  server.ListenAndServe()

}

代碼清單3-3展示了Server結(jié)構(gòu)所有可選的配置選項(xiàng)。

代碼清單3-3 Server結(jié)構(gòu)的配置選項(xiàng)

type Server struct {

  Addr      string

  Handler    Handler

  ReadTimeout  time.Duration

  WriteTimeout  time.Duration

  MaxHeaderBytes int

  TLSConfig   *tls.Config

  TLSNextProto  map[string]func(*Server, *tls.Conn, Handler)

  ConnState   func(net.Conn, ConnState)

  ErrorLog    *log.Logger

}

通過(guò)HTTPS提供服務(wù)

當(dāng)客戶(hù)端和服務(wù)器需要共享密碼或者信用卡信息這樣的私密信息時(shí),大多數(shù)網(wǎng)站都會(huì)使用HTTPS對(duì)客戶(hù)端和服務(wù)器之間的通信進(jìn)行加密和保護(hù)。在一些情況下,這種保護(hù)甚至是強(qiáng)制性的。比如說(shuō),如果一個(gè)網(wǎng)站提供了信用卡支付功能,那么按照支付卡行業(yè)數(shù)據(jù)安全標(biāo)準(zhǔn)(Payment Card Industry Data Security Standard),這個(gè)網(wǎng)站就必須對(duì)客戶(hù)端和服務(wù)器之間的通信進(jìn)行加密。像Gmail和Facebook這樣帶有隱私性質(zhì)的網(wǎng)站甚至在整個(gè)網(wǎng)站上都啟用了HTTPS。如果你打算開(kāi)發(fā)一個(gè)網(wǎng)站,而這個(gè)網(wǎng)站又需要提供用戶(hù)登錄功能,那么你也需要在這個(gè)網(wǎng)站上啟用HTTPS。

HTTPS實(shí)際上就是將HTTP通信放到SSL之上進(jìn)行。通過(guò)使用ListenAndServeTLS函數(shù),我們可以讓之前展示過(guò)的簡(jiǎn)單Web應(yīng)用也提供HTTPS服務(wù),代碼清單3-4展示了具體的實(shí)現(xiàn)代碼。

代碼清單3-4 通過(guò)HTTPS提供服務(wù)

package main


import (

  "net/http"

)


func main() {

  server := http.Server{

    Addr: "127.0.0.1:8080",

    Handler: nil,

  }

  server.ListenAndServeTLS("cert.pem", "key.pem")

}

這段代碼中的cert.pem文件是SSL證書(shū),而key.pem則是服務(wù)器的私鑰(private key)。在生產(chǎn)環(huán)境中使用的SSL證書(shū)需要通過(guò)VeriSign、Thawte或者Comodo SSL這樣的CA取得,但如果是出于測(cè)試目的才使用證書(shū)和私鑰,那么使用自行生成的證書(shū)就可以了。生成證書(shū)的辦法有很多種,其中一種就是使用Go標(biāo)準(zhǔn)庫(kù)中的crypto包群(library group)。

SSL、TLS和HTTPS

 SSL(Secure Socket Layer,安全套接字層)是一種通過(guò)公鑰基礎(chǔ)設(shè)施(Public Key Infrastructure,PKI)為通信雙方提供數(shù)據(jù)加密和身份驗(yàn)證的協(xié)議,其中通信的雙方通常是客戶(hù)端和服務(wù)器。SSL最初由Netscape公司開(kāi)發(fā),之后由IETF(Internet Engineering Task Force,互聯(lián)網(wǎng)工程任務(wù)組)接手并將其改名為T(mén)LS(Transport Layer Security,傳輸層安全協(xié)議)。HTTPS,即SSL之上的HTTP,實(shí)際上就是在SSL/TLS連接的上層進(jìn)行HTTP通信。

HTTPS需要使用SSL/TLS證書(shū)來(lái)實(shí)現(xiàn)數(shù)據(jù)加密以及身份驗(yàn)證。SSL證書(shū)存儲(chǔ)在服務(wù)器之上,它是一種使用X.509格式進(jìn)行格式化的數(shù)據(jù),這些數(shù)據(jù)包含了公鑰以及其他一些相關(guān)信息。為了保證證書(shū)的可靠性,證書(shū)一般由證書(shū)分發(fā)機(jī)構(gòu)(Certificate Authority,CA)簽發(fā)。服務(wù)器在接收到客戶(hù)端發(fā)送的請(qǐng)求之后,會(huì)將證書(shū)和響應(yīng)一并返回給客戶(hù)端,而客戶(hù)端在確認(rèn)證書(shū)的真實(shí)性之后,就會(huì)生成一個(gè)隨機(jī)密鑰(random key),并使用證書(shū)中的公鑰對(duì)隨機(jī)密鑰進(jìn)行加密,此次加密產(chǎn)生的對(duì)稱(chēng)密鑰(symmetric key)就是客戶(hù)端和服務(wù)器在進(jìn)行通信時(shí),負(fù)責(zé)對(duì)通信實(shí)施加密的實(shí)際密鑰(actual key)。

雖然我們不會(huì)在生產(chǎn)環(huán)境中使用自行生成的證書(shū)和私鑰,但了解SSL證書(shū)和私鑰的生成方法,并學(xué)會(huì)如何在開(kāi)發(fā)和測(cè)試的過(guò)程中使用證書(shū)和私鑰,也是一件非常有意義的事情。代碼清單3-5展示了生成SSL證書(shū)以及服務(wù)器私鑰的具體代碼。

代碼清單3-5 生成個(gè)人使用的SSL證書(shū)以及服務(wù)器私鑰

package main


import (

  "crypto/rand"

  "crypto/rsa"

  "crypto/x509"

  "crypto/x509/pkix"

  "encoding/pem"

  "math/big"

  "net"

  "os"

  "time"

)

func main() {

  max := new(big.Int).Lsh(big.NewInt(1), 128)

  serialNumber, _ := rand.Int(rand.Reader, max)

  subject := pkix.Name{

    Organization:    []string{"Manning Publications Co."},

    OrganizationalUnit: []string{"Books"},

    CommonName:     "Go Web Programming",

  }


  template := x509.Certificate{

    SerialNumber: serialNumber,

    Subject:   subject,

    NotBefore:  time.Now(),

    NotAfter:   time.Now().Add(365 * 24 * time.Hour),

    KeyUsage:   x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,

    ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},

    IPAddresses: []net.IP{net.ParseIP("127.0.0.1")},

  }


  pk, _ := rsa.GenerateKey(rand.Reader, 2048)


  derBytes, _ := x509.CreateCertificate(rand.Reader, &template,

  ?&template, &pk.PublicKey, pk)

  certOut, _ := os.Create("cert.pem")

  pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})

  certOut.Close()


  keyOut, _ := os.Create("key.pem")

  pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes:

  ?x509.MarshalPKCS1PrivateKey(pk)})

  keyOut.Close()

}

生成SSL證書(shū)和密鑰的步驟并不是特別復(fù)雜。因?yàn)镾SL證書(shū)實(shí)際上就是一個(gè)將擴(kuò)展密鑰用法(extended key usage)設(shè)置成了服務(wù)器身份驗(yàn)證操作的X.509證書(shū),所以程序在生成證書(shū)時(shí)使用了crypto/x509標(biāo)準(zhǔn)庫(kù)。此外,因?yàn)閯?chuàng)建證書(shū)需要用到私鑰,所以程序在使用私鑰成功創(chuàng)建證書(shū)之后,會(huì)將私鑰單獨(dú)保存在一個(gè)存放服務(wù)器私鑰的文件里面。

讓我們來(lái)仔細(xì)分析一下代碼清單3-5中的主要代碼吧。首先,程序使用一個(gè)Certificate結(jié)構(gòu)來(lái)對(duì)證書(shū)進(jìn)行配置:

template := x509.Certificate{

 SerialNumber: serialNumber,

 Subject: subject,

 NotBefore: time.Now(),

 NotAfter: time.Now().Add(365*24*time.Hour),

 KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,

 ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},

 IPAddresses: []net.IP{net.ParseIP("127.0.0.1")},

}

結(jié)構(gòu)中的證書(shū)序列號(hào)(SerialNumber)用于記錄由CA分發(fā)的唯一號(hào)碼,為了能讓我們的Web應(yīng)用運(yùn)行起來(lái),程序在這里生成了一個(gè)非常長(zhǎng)的隨機(jī)整數(shù)來(lái)作為證書(shū)序列號(hào)。之后,程序創(chuàng)建了一個(gè)專(zhuān)有名稱(chēng)(distinguished name),并將它設(shè)置成了證書(shū)的標(biāo)題(subject)。此外,程序還將證書(shū)的有效期設(shè)置成了一年,而結(jié)構(gòu)中KeyUsage字段和ExtKeyUsage字段的值則表明了這個(gè)X.509證書(shū)是用于進(jìn)行服務(wù)器身份驗(yàn)證操作的。最后,程序?qū)⒆C書(shū)設(shè)置成了只能在IP地址127.0.0.1之上運(yùn)行。

SSL證書(shū)

X.509是國(guó)際電信聯(lián)盟電信標(biāo)準(zhǔn)化部門(mén)(ITU-T)為公鑰基礎(chǔ)設(shè)施制定的一個(gè)標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)包含了公鑰證書(shū)的標(biāo)準(zhǔn)格式。

一個(gè)X.509證書(shū)(簡(jiǎn)稱(chēng)SSL證書(shū))實(shí)際上就是一個(gè)經(jīng)過(guò)編碼的ASN.1(Abstract Syntax Notation One,抽象語(yǔ)法表示法/1)格式的電子文檔。ASN.1既是一個(gè)標(biāo)準(zhǔn),也是一種表示法,它描述了表示電信以及計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)的規(guī)則和結(jié)構(gòu)。

X.509證書(shū)可以使用多種格式編碼,其中一種編碼格式是BER(Basic Encoding Rules,基本編碼規(guī)則)。BER格式指定了一種自解釋并且自定義的格式用于對(duì)ASN.1數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼,而DER格式則是BER的一個(gè)子集。DER只提供了一種編碼ASN.1值的方法,這種方法被廣泛地應(yīng)用于密碼學(xué)當(dāng)中,尤其是對(duì)X.509證書(shū)進(jìn)行加密。

SSL證書(shū)可以以多種不同的格式保存,其中一種是PEM(Privacy Enhanced Email,隱私增強(qiáng)郵件)格式,這種格式會(huì)對(duì)DER格式的X.509證書(shū)實(shí)施Base64編碼,并且這種格式的文件都以-----BEGIN CERTIFICATE-----開(kāi)頭,以-----END CERTIFICATE-----結(jié)尾(除了用作文件格式之外,PEM和此處討論的SSL證書(shū)關(guān)系并不大)。

在此之后,程序通過(guò)調(diào)用crypto/rsa標(biāo)準(zhǔn)庫(kù)中的GenerateKey函數(shù)生成了一個(gè)RSA私鑰:

pk, _ := rsa.GenerateKey(rand.Reader, 2048)

程序創(chuàng)建的RSA私鑰的結(jié)構(gòu)里面包含了一個(gè)能夠公開(kāi)訪(fǎng)問(wèn)的公鑰(public key),這個(gè)公鑰在使用x509.CreateCertificate函數(shù)創(chuàng)建SSL證書(shū)的時(shí)候就會(huì)用到:

derBytes, _ := x509.CreateCertificate(rand.Reader, &template, &template,?

?&pk.PublicKey, pk)

CreateCertificate函數(shù)接受Certificate結(jié)構(gòu)、公鑰和私鑰等多個(gè)參數(shù),創(chuàng)建出一個(gè)經(jīng)過(guò)DER編碼格式化的字節(jié)切片。后續(xù)代碼的意圖也非常簡(jiǎn)單明了,它們首先使用encoding/pem標(biāo)準(zhǔn)庫(kù)將證書(shū)編碼到cert.pem文件里面:

certOut, _ := os.Create("cert.pem")

pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})

certOut.Close()

然后繼續(xù)以PEM編碼的方式把之前生成的密鑰編碼并保存到key.pem文件里面:

keyOut, _ := os.Create("key.pem")

pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes:?

?x509.MarshalPKCS1PrivateKey(pk)})

keyOut.Close()

最后需要提醒的是,如果證書(shū)是由CA簽發(fā)的,那么證書(shū)文件中將同時(shí)包含服務(wù)器簽名以及CA簽名,其中服務(wù)器簽名在前,CA簽名在后。

本文摘自《Go Web編程

原文中此處為鏈接,暫不支持采集

點(diǎn)擊封面試讀更多內(nèi)容

無(wú)論是經(jīng)驗(yàn)老到的gopher,還是剛開(kāi)始接觸Go語(yǔ)言的Web開(kāi)發(fā)者,這都是必不可少的一本書(shū),本書(shū)囊括了關(guān)于Go Web應(yīng)用的開(kāi)發(fā)和部署的全部知識(shí)?


本書(shū)目錄:(滑動(dòng)手機(jī)查看)

第一部分 Go與Web應(yīng)用?
第1章 Go與Web應(yīng)用 ?3?
1.1 使用Go語(yǔ)言構(gòu)建Web應(yīng)用 ?3?
1.1.1 Go與可擴(kuò)展Web應(yīng)用 ?4?
1.1.2 Go與模塊化Web應(yīng)用 ?4?
1.1.3 Go與可維護(hù)的Web應(yīng)用 ?5?
1.1.4 Go與高性能Web應(yīng)用 ?5?
1.2 Web應(yīng)用的工作原理 ?6?
1.3 HTTP簡(jiǎn)介 ?7?
1.4 Web應(yīng)用的誕生 ?8?
1.5 HTTP請(qǐng)求 ?9?
1.5.1 請(qǐng)求方法 ?10?
1.5.2 安全的請(qǐng)求方法 ?11?
1.5.3 冪等的請(qǐng)求方法 ?11?
1.5.4 瀏覽器對(duì)請(qǐng)求方法的支持 ?11?
1.5.5 請(qǐng)求首部 ?12?
1.6 HTTP響應(yīng) ?13?
1.6.1 響應(yīng)狀態(tài)碼 ?13?
1.6.2 響應(yīng)首部 ?14?
1.7 URI ?15?
1.8 HTTP/2簡(jiǎn)介 ?16?
1.9 Web應(yīng)用的各個(gè)組成部分 ?16?
1.9.1 處理器 ?17?
1.9.2 模板引擎 ?18?
1.10 Hello Go ?18?
1.11 ?小結(jié) ?21?

第2章 ?ChitChat論壇 ?23?
2.1 ChitChat簡(jiǎn)介 ?23?
2.2 應(yīng)用設(shè)計(jì) ?24?
2.3 數(shù)據(jù)模型 ?26?
2.4 請(qǐng)求的接收與處理 ?27?
2.4.1 多路復(fù)用器 ?27?
2.4.2 服務(wù)靜態(tài)文件 ?29?
2.4.3 創(chuàng)建處理器函數(shù) ?29?
2.4.4 使用cookie進(jìn)行訪(fǎng)問(wèn)控制 ?30?
2.5 使用模板生成HTML響應(yīng) ?33?
2.6 安裝PostgreSQL ?38?
2.6.1 在Linux或FreeBSD系統(tǒng)上安裝 ?38?
2.6.2 在Mac OS X系統(tǒng)上安裝 ?39?
2.6.3 在Windows系統(tǒng)上安裝 ?39?
2.7 連接數(shù)據(jù)庫(kù) ?39?
2.8 啟動(dòng)服務(wù)器 ?44?
2.9 Web應(yīng)用運(yùn)作流程回顧 ?45?
2.10 小結(jié) ?46?

第二部分 Web應(yīng)用的基本組成部分?
第3章 ?接收請(qǐng)求 ?49?
3.1 Go的net/http標(biāo)準(zhǔn)庫(kù) ?49?
3.2 使用Go構(gòu)建服務(wù)器 ?51?
3.2.1 Go Web服務(wù)器 ?51?
3.2.2 通過(guò)HTTPS提供服務(wù) ?53?
3.3 處理器和處理器函數(shù) ?56?
3.3.1 處理請(qǐng)求 ?56?
3.3.2 使用多個(gè)處理器 ?58?
3.3.3 處理器函數(shù) ?59?
3.3.4 串聯(lián)多個(gè)處理器和處理器函數(shù) ?61?
3.3.5 ServeMux和DefaultServeMux ?65?
3.3.6 使用其他多路復(fù)用器 ?66?
3.4 使用HTTP/2 ?68?
3.5 小結(jié) ?70?

第4章 ?處理請(qǐng)求 ?72?
4.1 請(qǐng)求和響應(yīng) ?72?
4.1.1 Request結(jié)構(gòu) ?73?
4.1.2 請(qǐng)求URL ?73?
4.1.3 請(qǐng)求首部 ?74?
4.1.4 請(qǐng)求主體 ?76?
4.2 Go與HTML表單 ?77?
4.2.1 Form字段 ?79?
4.2.2 PostForm字段 ?80?
4.2.3 MultipartForm字段 ?81?
4.2.4 文件 ?83?
4.2.5 處理帶有JSON主體的POST請(qǐng)求 ?85?
4.3 ResponseWriter ?86?
4.4 cookie ?91?
4.4.1 Go與cookie 91?
4.4.2 將cookie發(fā)送至瀏覽器 ?92?
4.4.3 從瀏覽器里面獲取cookie ?94?
4.4.4 使用cookie實(shí)現(xiàn)閃現(xiàn)消息 ?96?
4.5 小結(jié) ?99?

第5章 ?內(nèi)容展示 ?100?
5.1 模板引擎 ?100?
5.2 Go的模板引擎 ?102?
5.2.1 對(duì)模板進(jìn)行語(yǔ)法分析 ?104?
5.2.2 執(zhí)行模板 ?105?
5.3 動(dòng)作 ?106?
5.3.1 條件動(dòng)作 ?106?
5.3.2 迭代動(dòng)作 ?108?
5.3.3 設(shè)置動(dòng)作 ?109?
5.3.4 包含動(dòng)作 ?111?
5.4 參數(shù)、變量和管道 ?113?
5.5 ?函數(shù) ?114?
5.6 上下文感知 ?116?
5.6.1 防御XSS攻擊 ?119?
5.6.2 不對(duì)HTML進(jìn)行轉(zhuǎn)義 ?121?
5.7 嵌套模板 ?122?
5.8 通過(guò)塊動(dòng)作定義默認(rèn)模板 ?126?
5.9 小結(jié) ?127?

第6章 ?存儲(chǔ)數(shù)據(jù) ?128?
6.1 內(nèi)存存儲(chǔ) ?128?
6.2 文件存儲(chǔ) ?131?
6.2.1 讀取和寫(xiě)入CSV文件 ?133?
6.2.2 gob包 ?135?
6.3 Go與SQL ?137?
6.3.1 設(shè)置數(shù)據(jù)庫(kù) ?138?
6.3.2 連接數(shù)據(jù)庫(kù) ?140?
6.3.3 創(chuàng)建帖子 ?142?
6.3.4 獲取帖子 ?144?
6.3.5 更新帖子 ?145?
6.3.6 刪除帖子 ?145?
6.3.7 一次獲取多篇帖子 ?146?
6.4 Go與SQL的關(guān)系 ?147?
6.4.1 設(shè)置數(shù)據(jù)庫(kù) ?147?
6.4.2 一對(duì)多關(guān)系 ?150?
6.5 Go與關(guān)系映射器 ?152?
6.5.1 Sqlx ?152?
6.5.2 Gorm ?154?
6.6 小結(jié) ?157?

第三部分 實(shí)戰(zhàn)演練?
第7章 ?Go Web服務(wù) ?161?
7.1 Web服務(wù)簡(jiǎn)介 ?161?
7.2 基于SOAP的Web服務(wù)簡(jiǎn)介 ?163?
7.3 基于REST的Web服務(wù)簡(jiǎn)介 ?166?
7.3.1 將動(dòng)作轉(zhuǎn)換為資源 ?168?
7.3.2 將動(dòng)作轉(zhuǎn)換為資源的屬性 ?169?
7.4 通過(guò)Go分析和創(chuàng)建XML ?169?
7.4.1 分析XML ?169?
7.4.2 創(chuàng)建XML ?177?
7.5 通過(guò)Go分析和創(chuàng)建JSON ?180?
7.5.1 分析JSON ?181?
7.5.2 創(chuàng)建JSON ?184?
7.6 創(chuàng)建Go Web服務(wù) ?187?
7.7 小結(jié) ?194?

第8章 ?應(yīng)用測(cè)試 ?196?
8.1 Go與測(cè)試 ?196?
8.2 使用Go進(jìn)行單元測(cè)試 ?197?
8.2.1 跳過(guò)測(cè)試用例 ?201?
8.2.2 以并行方式運(yùn)行測(cè)試 ?202?
8.2.3 基準(zhǔn)測(cè)試 ?203?
8.3 使用Go進(jìn)行HTTP測(cè)試 ?206?
8.4 測(cè)試替身以及依賴(lài)注入 ?210?
8.5 第三方Go測(cè)試庫(kù) ?217?
8.5.1 Gocheck測(cè)試包簡(jiǎn)介 ?217?
8.5.2 Ginkgo測(cè)試框架簡(jiǎn)介 ?223?
8.6 小結(jié) ?228?

第9章 ?發(fā)揮Go的并發(fā)優(yōu)勢(shì) ?230?
9.1 并發(fā)與并行的區(qū)別 ?230?
9.2 goroutine ?232?
9.2.1 使用goroutine ?232?
9.2.2 goroutine與性能 ?235?
9.2.3 等待goroutine ?238?
9.3 通道 ?239?
9.3.1 通過(guò)通道實(shí)現(xiàn)同步 ?240?
9.3.2 通過(guò)通道實(shí)現(xiàn)消息傳遞 ?242?
9.3.3 有緩沖通道 ?243?
9.3.4 從多個(gè)通道中選擇 ?244?
9.4 在Web應(yīng)用中使用并發(fā) ?247?
9.4.1 創(chuàng)建馬賽克圖片 ?248?
9.4.2 馬賽克圖片Web應(yīng)用 ?251?
9.4.3 并發(fā)版馬賽克圖片生成Web應(yīng)用 ?254?
9.5 小結(jié) ?262?

第10章 ?Go的部署 ?263?
10.1 將應(yīng)用部署到獨(dú)立的 服務(wù)器 ?264?
10.2 將應(yīng)用部署到 Heroku ?270?
10.3 將應(yīng)用部署到Google App Engine ?273?
10.4 將應(yīng)用部署到 Docker ?278?
10.4.1 什么是Docker ?278?
10.4.2 安裝Docker ?279?
10.4.3 Docker的理念與 組件 ?280?
10.4.4 Docker化一個(gè)Go Web 應(yīng)用 ?281?
10.4.5 將Docker容器推送至 互聯(lián)網(wǎng) ?283?
10.5 部署方法之間的 對(duì)比 ?286?
10.6 小結(jié) ?287?
附錄 ?安裝和設(shè)置Go ?288?

延伸推薦

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

點(diǎn)擊關(guān)鍵詞閱讀更多新書(shū):

原文中此處為鏈接,暫不支持采集

|

原文中此處為鏈接,暫不支持采集

|

原文中此處為鏈接,暫不支持采集

|

原文中此處為鏈接,暫不支持采集

|

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

|

原文中此處為鏈接,暫不支持采集

|

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

原文中此處為鏈接,暫不支持采集

點(diǎn)擊圖片參與活動(dòng)

異步圖書(shū)”后臺(tái)回復(fù)“關(guān)注”,即可免費(fèi)獲得2000門(mén)在線(xiàn)視頻課程;推薦朋友關(guān)注根據(jù)提示獲取贈(zèng)書(shū)鏈接,免費(fèi)得異步圖書(shū)一本。趕緊來(lái)參加哦!

掃一掃上方二維碼,回復(fù)“關(guān)注”參與活動(dòng)!


點(diǎn)擊閱讀原文,購(gòu)買(mǎi)《Go Web編程》


本頁(yè)內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過(guò)網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶(hù)學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁(yè)中由涉嫌抄襲的內(nèi)容,請(qǐng)及時(shí)與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會(huì)在5工作日內(nèi)聯(lián)系您,一經(jīng)查實(shí),本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://jstctz.cn/20536.html
相關(guān)開(kāi)發(fā)語(yǔ)言
 八年  行業(yè)經(jīng)驗(yàn)

多一份參考,總有益處

聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費(fèi)獲得網(wǎng)站建設(shè)方案及報(bào)價(jià)

咨詢(xún)相關(guān)問(wèn)題或預(yù)約面談,可以通過(guò)以下方式與我們聯(lián)系

業(yè)務(wù)熱線(xiàn):余經(jīng)理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.