一文读懂Go语言的net/http标准库

  • 时间:
  • 浏览:0

第6章  存储数据  128 

  x10009.MarshalPKCS1PrivateKey(pk)})

package main

&pk.PublicKey, pk)

本书目录:(滑动手机查看)

无论是经验老到的gopher,还是不会不会开始英语 接触Go语言的Web开发者,这都不 必不可少的一本书,本书囊括了关于Go Web应用的开发和部署的详细知识 

如图2所示,通过net/http标准库,亲戚亲戚朋友都不不 启动一有二个HTTP服务器,而且愿意这个服务器接收请求并向请求返回响应。除此之外,net/http标准库还提供了一有二个连接多路复用器(multiplexer)的接口以及一有二个默认的多路复用器。

  Handler    Handler

用户除了都不不 通过ListenAndServe的参数对服务器的网络地址和正确处理器进行配置之外,还都不不 通过Server行态对服务器进行更详细的配置,其中包括为请求读取操作设置超时时间、为响应写入操作设置超时时间以及为Server行态设置错误日志记录器等。

  }

import (

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

任务管理器创建的RSA私钥的行态上方饱含 了一有二个不不 公开访问的公钥(public key),你这个公钥在使用x10009.CreateCertificate函数创建SSL证书的不会就会用到:

  certOut.Close()

    SerialNumber: serialNumber,

最后时要提醒的是,肯能证书是由CA签发的,那么证书文件中将一齐饱含 服务器签名以及CA签名,其中服务器签名在前,CA签名在后。

 SerialNumber: serialNumber,

本文接下来肯能展示怎样才能把net/http标准库用作服务器以及怎样才能使用Go语言接收客户端发送的HTTP请求。在不会的第4章,亲戚亲戚朋友都不 继续使用net/http标准库,但焦点会倒进怎样才能正确处理请求上方。

)

扫一扫上方二维码,回复“关注”参与活动!

在此不会,任务管理器通过调用crypto/rsa标准库中的GenerateKey函数生成了一有二个RSA私钥:

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

  "math/big"

  "net"

  "crypto/rsa"

点击封面试读更多内容

图2 通过Go服务器正确处理请求

func main() {

跟你这个编程语言上方的绝大多数标准库不一样,Go提供了一系列用于创建Web服务器的标准库。正如代码清单3-1所示,创建一有二个服务器的步骤非常简单,假如调用ListenAndServe并传入网络地址以及负责正确处理请求的正确处理器(handler)作为参数就都不不 了。肯能网络地址参数为空字符串,那么服务器默认使用1000端口进行网络连接;肯能正确处理器参数为nil,那么服务器将使用默认的多路复用器DefaultServeMux

  "crypto/x10009/pkix"

在Go Web编程中,亲戚亲戚朋友主要关注的是怎样才能使用net/http标准库的服务器功能而非客户端功能。

    Handler: nil,

  ConnState   func(net.Conn, ConnState)

异步图书”后台回复“关注”,即可免费获得10000门在线视频课程;推荐亲戚亲戚朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!

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

)

  keyOut.Close()

行态中的证书序列号(SerialNumber)用于记录由CA整理的唯一号码,为了能让亲戚亲戚朋友的Web应用运行起来,任务管理器在这里生成了一有二个非常长的随机整数来作为证书序列号。不会,任务管理器创建了一有二个专有名称(distinguished name),并将它设置成了证书的标题(subject)。此外,任务管理器还将证书的有效期设置成了一年,而行态中KeyUsage字段和ExtKeyUsage字段的值则表明了你这个X.10009证书是用于进行服务器身份验证操作的。最后,任务管理器将证书设置成了都不不 了在IP地址127.0.0.1之上运行。

template := x10009.Certificate{

import (

package main

第三要素 实战演练 

  server.ListenAndServe()

  Addr      string

  "crypto/x10009"

第5章  内容展示  1000 

}

图1 net/http标准库的各个组成要素

代码清单3-2 饱含 附加配置的Web服务器

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

  "net/http"

点击关键词阅读更多新书:

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

func main() {

代码清单3-3 Server行态的配置选项

第二要素 Web应用的基本组成要素 

  server := http.Server{

当客户端和服务器时要共享密码肯能信用卡信息原本的私密信息时,大多数网站都不 使用HTTPS对客户端和服务器之间的通信进行加密和保护。在你这个清况 下,你这个保护甚至是强制性的。比如说,肯能一有二个网站提供了信用卡支付功能,那么按照支付卡行业数据安全标准(Payment Card Industry Data Security Standard),你这个网站就时要对客户端和服务器之间的通信进行加密。像Gmail和Facebook原本饱含 隐私性质的网站甚至在整个网站上都启用了HTTPS。肯能你打算开发一有二个网站,而你这个网站又时要提供用户登录功能,那么你也时要在你这个网站上启用HTTPS。

生成SSL证书和密钥的步骤不与非 不怎样才能会僵化 。肯能SSL证书实际上好多好多 我一有二个将扩展密钥用法(extended key usage)设置成了服务器身份验证操作的X.10009证书,好多好多 任务管理器在生成证书时使用了crypto/x10009标准库。此外,肯能创建证书时要用到私钥,好多好多 任务管理器在使用私钥成功创建证书不会,会将私钥单独保占据 一有二个存放服务器私钥的文件上方。

 KeyUsage: x10009.KeyUsageKeyEncipherment | x10009.KeyUsageDigitalSignature,

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

CreateCertificate函数接受Certificate行态、公钥和私钥等多个参数,创建出一有二个经过DER编码格式化的字节切片。后续代码的意图也非常简单明了,它们首先使用encoding/pem标准库将证书编码到cert.pem文件上方:

keyOut.Close()

import (

2017优秀图书和作译者评选-进行中赢取kindle等技术图书礼!

    CommonName:     "Go Web Programming",

货物崇拜编程

}

    Handler: nil,

SSL证书

  server := http.Server{

    Addr:  "127.0.0.1:10001000",

其实亲戚亲戚朋友不那么生产环境中使用自行生成的证书和私钥,但了解SSL证书和私钥的生成措施,并学着怎样才能在开发和测试的过程中使用证书和私钥,也是一件非常有意义的事情。代码清单3-5展示了生成SSL证书以及服务器私钥的具体代码。

  ReadTimeout  time.Duration

代码清单3-2和代码清单3-1的作用基本上是相同的,它们之间的唯一区别在于代码清单3-2都不不 通过Server行态对服务器进行更多的配置。

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

 Subject: subject,

    Addr: "127.0.0.1:10001000",

本文摘自《Go Web编程

package main

HTTPS时要使用SSL/TLS证书来实现数据加密以及身份验证。SSL证书存储在服务器之上,它是一种使用X.10009格式进行格式化的数据,哪些数据饱含 了公钥以及你这个你这个相关信息。为了保证证书的可靠性,证书一般由证书整理机构(Certificate Authority,CA)签发。服务器在接收到客户端发送的请求不会,会将证书和响应一齐返回给客户端,而客户端在确认证书的真实性不会,就会生成一有二个随机密钥(random key),并使用证书中的公钥对随机密钥进行加密,此次加密产生的对称密钥(symmetric key)好多好多 我客户端和服务器在进行通信时,负责对通信实施加密的实际密钥(actual key)。

ServerServeMuxHandler/HandleFuncResponseWriterHeaderRequestCookie则对服务器进行支持。

代码清单3-5 生成这个人所有所有使用的SSL证书以及服务器私钥

 SSL(Secure Socket Layer,安全套接字层)是一种通过公钥基础设施(Public Key Infrastructure,PKI)为通信双方提供数据加密和身份验证的协议,其中通信的双方通常是客户端和服务器。SSL最初由Netscape公司开发,不会由IETF(Internet Engineering Task Force,互联网工程任务组)接手并将其改名为TLS(Transport Layer Security,传输层安全协议)。HTTPS,即SSL之上的HTTP,实际上好多好多 我在SSL/TLS连接的上层进行HTTP通信。

X.10009是国际电信联盟电信标准化部门(ITU-T)为公钥基础设施制定的一有二个标准,你这个标准饱含 了公钥证书的标准格式。

func main() {

举个例子来说,肯能HTTP是一种无连接协议(connection-less protocol),通过你这个协议发送给服务器的请求对服务器不会正确处理过的请求一无所知,好多好多 应用任务管理器才会以cookie的措施在客户端实现数据持久化,并以会话的措施在服务器上实现数据持久化,而不了解你这个点的人是那么理解为哪些要在不同连接之间使用cookie和会话实现信息持久化的。为了降低使用cookie和会话带来的僵化 性,Web应用框架通常都不 提供一有二个统一的接口(uniform interface),用于在连接之间实现持久化。原本做的结果是,好多好多 新手任务管理器员都不 想当然地假设在连接之间进行持久化唯一要做的好多好多 我使用框架提供的接口。而且肯能这个接口通常都不 根据框架自身的习惯制定的,而且不同框架提供的接口肯能会有所不同。更糟糕的是,不同的框架肯能会提供你这个名字相同的接口,而且哪些同名接口之间的实现却又千差万别、各不相同,而且给开发者带来不太多的困惑。通过你这个例子都不不 看出,使用框架进行Web应用开发愿因着将框架与应用进行绑定,不会无论是将应用迁移至原本框架,还是对应用进行扩展,又肯能为应用上加新的行态,都时要对框架一种有深入的了解,在你这个清况 下肯能还时要对框架进行定制。

   "net/http"

}

    Subject:   subject,

第9章  发挥Go的并发优势  21000 

而且继续以PEM编码的措施把不会生成的密钥编码并保存到key.pem文件上方:

package main

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

对Go语言来说,隐藏在框架之下的通常是net/httphtml/template你这个有二个标准库,如图1所示,net/http标准库都不不 分为客户端和服务器一有二个要素,库中的行态和函数你这个只支持客户端和服务器这两者中的一有二个,而你这个则一齐支持客户端和服务器:

代码清单3-4 通过HTTPS提供服务

第10章  Go的部署  263 

2017内核大会看点云集

尽管货物崇拜任务管理器员并那么像岛民一样挥舞指挥棒,但亲戚亲戚朋友却几滴 地克隆qq好友好友和粘贴从StackOverflow这个网站上找来的代码,哪些代码其实不不 运行,而且亲戚亲戚朋友却对哪些代码的工作原理你这个好多好多 我了解。原本做的结果是,亲戚亲戚朋友通常无法扩展和修改哪些代码。与此这个,货物崇拜任务管理器员通常会在既不了解框架为哪些使用特定的模式或约定,也真不知道框架做了何种选用的清况 下,盲目地使用Web框架。

)

   http.ListenAndServe("", nil)

第4章  正确处理请求  72 

    KeyUsage:   x10009.KeyUsageKeyEncipherment | x10009.KeyUsageDigitalSignature,

import (

Python|机器学习|Kotlin|Java|移动开发|机器人|有奖活动|Web前端|书单

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

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

  WriteTimeout  time.Duration

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

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

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

 NotBefore: time.Now(),

代码清单3-1 最简单的Web服务器

  subject := pkix.Name{

  }

  }

你所不了解的Kafka

SSL证书都不不 以多种不同的格式保存,其中一种是PEM(Privacy Enhanced Email,隐私增强邮件)格式,你这个格式会对DER格式的X.10009证书实施Base64编码,而且你这个格式的文件都以-----BEGIN CERTIFICATE-----开头,以-----END CERTIFICATE-----结尾(除了用作文件格式之外,PEM和此处讨论的SSL证书关系不不大)。

func main() {

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

  "net/http"

在进行Web应用开发的不会,使用心智心智成熟的句子期 是什么期是什么 图片 而且僵化 的Web应用框架通常会使开发变得更加那么快和简便,但这也愿因着开发者时要接受框架自身的一套约定和模式。其实好多好多 框架都认为这个人所有所有提供的约定和模式是最佳实践(best practice),而且肯能开发者那么正确地理解哪些最佳实践,那么对最佳实践的应用就肯能会发展为货物崇拜编程(cargo cult programming):开发者肯能不了解哪些约定和模式的用法,就肯能会在不太多甚至有害的清况 下盲目地使用它们。

}

点击标题下「异步图书」可快速关注 

)

SSL、TLS和HTTPS

  MaxHeaderBytes int

点击图片参与活动

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

}

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

延伸推荐

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

x10009.MarshalPKCS1PrivateKey(pk)})

  "crypto/rand"

  TLSConfig   *tls.Config

X.10009证书都不不 使用多种格式编码,其中一种编码格式是BER(Basic Encoding Rules,基本编码规则)。BER格式指定了一种自解释而且自定义的格式用于对ASN.1数据行态进行编码,而DER格式则是BER的一有二个子集。DER只提供了一种编码ASN.1值的措施,你这个措施被广泛地应用于密码学当中,尤其是对X.10009证书进行加密。

type Server struct {

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

Kotlin最佳项目实战——欧瑞天气App

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

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

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

第一要素 Go与Web应用 

第1章 Go与Web应用  3 

1.1 使用Go语言构建Web应用  3 

1.1.1 Go与可扩展Web应用  4 

1.1.2 Go与模块化Web应用  4 

1.1.3 Go与可维护的Web应用  5 

1.1.4 Go与高性能Web应用  5 

1.2 Web应用的工作原理  6 

1.3 HTTP简介  7 

1.4 Web应用的诞生  8 

1.5 HTTP请求  9 

1.5.1 请求措施  10 

1.5.2 安全的请求措施  11 

1.5.3 幂等的请求措施  11 

1.5.4 浏览器对请求措施的支持  11 

1.5.5 请求首部  12 

1.6 HTTP响应  13 

1.6.1 响应清况 码  13 

1.6.2 响应首部  14 

1.7 URI  15 

1.8 HTTP/2简介  16 

1.9 Web应用的各个组成要素  16 

1.9.1 正确处理器  17 

1.9.2 模板引擎  18 

1.10 Hello Go  18 

1.11  小结  21 

第2章  ChitChat论坛  23 

本文的目的不与非 让亲戚亲戚朋友被抛弃框架、约定和模式——一有二个好的框架通常是快速构建可扩展且健壮的Web应用的最好措施,但理解哪些隐藏在框架之下的底层概念和基础设施也是非常重要的。假如对框架的实现原理有了正确的认识,亲戚亲戚朋友就都不不 更加清晰地了解到哪些约定和模式是怎样才能形成的,从而正确处理陷阱、理清思路,不再盲目地使用模式。

    OrganizationalUnit: []string{"Books"},

第二次世界大战期间,盟军为了对战事提供支援,在太平洋的多个岛屿上设立了空军基地,以空投的措施向部队以及支援部队的岛民投送了几滴 生活用品以及军事设备,从而极大地改善了部队以及岛民的生活,岛民也而且第一次都看了人工生产的衣物、罐头食品以及你这个物品。在战争不会开始英语 不会,哪些空军基地便被废弃了,货物空投自然也停止了。此时,岛民做了一件非常符合其本性的事情——亲戚亲戚朋友把这个人所有所有打扮成空管员、士兵以及水手,使用机场上的指挥棒挥舞着着陆信号,进行地面阅兵演习,试图让飞机继续空投货物,货物崇拜一词也而且而诞生。

代码清单3-3展示了Server行态所有可选的配置选项。

  template := x10009.Certificate{

}

一有二个X.10009证书(简称SSL证书)实际上好多好多 我一有二个经过编码的ASN.1(Abstract Syntax Notation One,抽象语法表示法/1)格式的电子文档。ASN.1既是一有二个标准,也是一种表示法,它描述了表示电信以及计算机网络数据的规则和行态。

  }

点击阅读原文,购买《Go Web编程》

  "time"

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

这段代码中的cert.pem文件是SSL证书,而key.pem则是服务器的私钥(private key)。在生产环境中使用的SSL证书时要通过VeriSign、Thawte肯能Comodo SSL原本的CA取得,但肯能是出于测试目的才使用证书和私钥,那么使用自行生成的证书就都不不 了。生成证书的措施有好多好多 种,其中一种好多好多 我使用Go标准库中的crypto包群(library group)。

通过HTTPS提供服务

HTTPS实际上好多好多 我将HTTP通信倒进SSL之上进行。通过使用ListenAndServeTLS函数,亲戚亲戚朋友都不不 让不会展示过的简单Web应用也提供HTTPS服务,代码清单3-4展示了具体的实现代码。

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

  ErrorLog    *log.Logger

第8章  应用测试  196 

certOut.Close()

  &template, &pk.PublicKey, pk)

让亲戚亲戚朋友来仔细分析一下代码清单3-5中的主要代码吧。首先,任务管理器使用一有二个Certificate行态来对证书进行配置:

  "os"

ClientResponseHeaderRequestCookie对客户端进行支持;

使用Go构建服务器

  "encoding/pem"

    NotBefore:  time.Now(),