在Golang中制作茶壶服务器

IETF(Internet工程任务组)喜欢为愚人节做事,1998年是他们添加418(即超文本咖啡壶控制协议 )的一年。

当然,这完全是胡说八道,这使它变得很棒。

您应该已经准备好Golang安装,并且知道如何创建和运行程序。

我们从您在大多数编程语言中看到的东西开始:导入包以做有用的事情。

package main import ( "fmt" "html" "log" "net/http" "os" )

Main只是我们在此处制作的程序的程序包名称。 一个更复杂的程序将为该程序创建许多程序包,并且它们将具有自己的名称。 您将包括那些带有导入的对象。

这是一个非常简单的程序,Golang附带了所有必需的工具。

  • fmt :用于在将输出发送到发出请求的客户端之前格式化输出。
  • html :用于从请求中将HTML剥离到主机之外。 没有这个,您将创建一个跨站点脚本漏洞。 有人可以伪造host字段,并在其中放置任意的,可能是讨厌的HTML,您的服务器将按照要求打印这些HTML。
  • log :用于将使用情况信息输出到运行程序的控制台。
  • net / http :一个神奇的地方,充满了用于创建HTTP客户端和服务器的有用工具。
  • os :以跨平台方式提供对各种操作系统功能的访问,例如读取命令行参数。

我将每个软件包名称链接到Golang软件包的官方文档,该文档写得很好。

func main() {

每个程序都有一个主要功能!

if 2 == len(os.Args) {

索引(例如os.Args)从零开始。 os.Args [0]是可执行文件的路径。 可执行路径由操作系统提供。 运行服务器的端口是os.Args [1]。 len()是不同的-它是数组中项目的计数,因此我们需要2个参数(可执行路径和端口)。

http.HandleFunc("/", func(write http.ResponseWriter, read *http.Request) { write.WriteHeader(http.StatusTeapot) fmt.Fprintf(write, "I'm a teapot running on %q", html.EscapeString(read.Host)) })

这将调用带有两个参数的http.HandleFunc:要侦听的URL,以及作为参数传递的函数来处理该URL。 因此/将是根目录,例如medium.com/或其他任何网站。

第二个参数可以是您在其他地方编写并在此处调用的函数吗? 大概! 我不知道! 您应该尝试一下,看看它是否破裂。 我发现许多示例都采用这种方式可能是有原因的,并且在某些情况下,如果可行,最好将其分解为单独的功能。

因此,在函数内构建和调用的此函数有点复杂。 让我们进一步分解。

函数括号内有两个调用。

write.WriteHeader(http.StatusTeapot)

您可能会问:“写的东西到底是哪里来的?” 这是一个很好的问题,很容易错过。 write是函数中我们小函数的第一个参数。 它包含一些方法(我在这里可能使用了错误的术语)。 这些方法之一是WriteHeader,它可以将标头写入客户端。 标头始终在HTTP中排在第一位。 http.StatusTeapot是一个常量,在net / http中定义,并将其设置为茶壶状态码:418。

fmt.Fprintf(write, "I'm a teapot running on %q", html.EscapeString(read.Host))

同样, write是Golang的http程序包提供的对象的实例,该对象将内容发送到发出请求的客户端。 fmt.Printf带有两个或多个参数:要写入的内容(在这种情况下,该对象称为write ),以及要写入客户端的任意数量的内容,用逗号分隔。

我们发送给请求客户的字符串分为两部分:

  • fmt软件包doc将%q定义为“使用Go语法安全地转义的单引号字符文字”。 有关其他动词,请参考fmt软件包文档。 当您尝试从不同数据类型的不同来源生成单行文本时,这样的格式化打印很有用。
  • html.EscapeString(read.Host)是%q的内容。 read.Host是客户端请求的主机,即域或IP端口。 正如我在列出软件包时提到的那样,这可以是任何东西。 这就是为什么在将输入传递回客户端之前调用html.EscapeString()清除输入的原因。 我不确定这里是否有必要,但这是一个好习惯,除非您确实需要将原始输入显示为输出。
port := string(os.Args[1])

这会将端口设置为用户在操作系统提供的路径之后提供的第一个参数。

http.ListenAndServe(":"+port, nil)

这指示http包使用port启动服务器,第二个参数为nil,因为我们之前已经定义了处理程序。 您可以在此处而不是nil调用处理程序函数,但我喜欢这种外观,发现它更易于使用。 net / http文档显示了解决此问题的其他方法。 仔细阅读软件包文档绝对不会浪费时间。

} else { log.Printf("Usage: %v <port>\n", os.Args[0]) } }

当您尝试运行命令行程序时,它会为您提供使用情况信息,而不是您要执行的操作,这是完成操作的一种方式。

我确定我错过了一些东西,并且部分内容不够清晰。 随意选择任何文本并发表评论。

这是完成的应用程序。 您也可以在Github上找到它。

package main import ( "fmt" "html" "log" "net/http" "os" ) func main() { if 2 == len(os.Args) { http.HandleFunc("/", func(write http.ResponseWriter, read *http.Request) { write.WriteHeader(http.StatusTeapot) fmt.Fprintf(write, "I'm a teapot running on %q", html.EscapeString(read.Host)) }) port := string(os.Args[1]) http.ListenAndServe(":"+port, nil) } else { log.Printf("Usage: %v <port>\n", os.Args[0]) } }

From: https://hackernoon.com/make-a-teapot-server-in-golang-edaf5ff158f5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值