图1-1 消息处理流程
步骤1: 创建一个目录,用来放置外部程序。此目录的名称可以自定义,本示例中命名为cgi-bin。
步骤2: 在cig-bin目录下创建新的代码文件code.go,然后输入以下代码。
import( "fmt""math/rand")
funcmain{ // 写入消息头fmt.Print( "Content-Type: text/html; charset=utf-8\r\n") fmt.Print( "Server-Ver: 1.0\r\n") varbts = make([] byte, 15) rand.Read(bts)fmt.Printf( "Access-Token: %x\r\n", bts) // 消息头与正文之间有空行分隔fmt.Print( "\r\n") // 以下是正文fmt.Print( "<h3>这是一个简单的 CGI 程序</h3>") }
此程序会直接输出HTTP响应消息。HTTP消息分为头部和正文两部分,两部分之间有一空白行。消息的整体格式如下:
在本示例中,每行的结尾使用了两个字符。“\r”是回车符,“\n”是换行符。
步骤3: 编译code.go代码文件。
步骤4: 在HTTP服务器中,为根URL注册一个Handler,并在此Handler的代码中执行test程序。
执行test程序后,需要读取响应的HTTP消息。首先使用bufio.Reader实例的ReadLine方法逐行读出消息头,然后以“:”为分隔符对字符串进行拆分,再去掉多余的空格,就能得到消息头的名称和对应的值了。一旦遇到空行,就表明消息头读取完毕,正文部分直接用io.Copy函数复制到http.ResponseWriter对象即可。
步骤5: 启动HTTP服务器并接收来自客户端的消息。
步骤6: 运行结果如图 1-2所示。
图1-2 由外部程序返回的内容
传回给客户端的HTTP消息头如下: