7.5. 基于http提供wiki页面

要使用http包,先将其导入:

  import (
      "fmt"
      "http"
      "io/ioutil"
      "os"
  )

然后创建一个用于浏览wiki的函数:

  const lenPath = len("/view/")

  func viewHandler(w http.ResponseWriter, r *http.Request) {
      title := r.URL.Path[lenPath:]
      p, _ := loadPage(title)
      fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", p.title, p.body)
  }

首先,这个函数从r.URL.Path(请求URL的path部分)中解析页面标题。全局常量lenPath保存"/view/"的长度,它是请求路径的前缀部分。Path总是以"/view/"开头,去掉前面的6个字符就可以得到页面标题。

然后加载页面数据,格式化为简单的HTML字符串,写到c中,c是一个http.Conn类型的参数。

注意这里使用下划线“_”忽略loadPage的os.Error返回值。 这不是一种好的做法,此处是为了保持简单。我们将在后面考虑这个问题。

为了使用这个处理函数(handler),我们创建一个main函数。它使用viewHandler初始化http,把所有以/view/开头的请求转发给viewHandler处理。

  func main() {
      http.HandleFunc("/view/", viewHandler)
      http.ListenAndServe(":8080", nil)
  }

点击这里查看我们当前的代码。

让我们创建一些页面数据(例如as test.txt),编译,运行。

  $ echo "Hello world" > test.txt
  $ 8g wiki.go
  $ 8l wiki.8
  $ ./8.out

当服务器运行的时候,访问http://localhost:8080/view/test将显示一个页面,标题为“test”,内容为“Hello world”。