0

我正在制作一个 Go 网站(小型服务),但不知道如何验证页面 URL 是否正确或找不到 404。最终我了解到 http 请求路由器/多路复用器存在。

例子:

eg.com/articles/animals/Hippos-are-aquatic-and-land-dwelling    = go to page
eg.com/articles/animals/Hippos-are-typofrifjirj     = 404 not found page

现在我只看到一种方法来做到这一点,你不知何故有一个网站的文章列表,然后你以某种方式将它传递给路由器。您应该如何获得该文章列表?

对于动态关系数据库站点:您是否在数据库中查询文章标题,并将其设为地图字符串?

对于静态网站上的静态文件:您在路由器或 net/http 中使用一些 http 文件服务器目录功能?

如果是这样,对于数据库,这是否意味着每次访问页面时都必须查询数据库?或者您是否将文章列表存储在文件或其他东西中并在每次制作新文章时更新它?

另外,我打算使用 https://github.com/julienschmidt/httprouter 或类似的。

4

1 回答 1

2

下面是使用 net/http 路由器的方法,假设/articles/animals/路径中的所有内容都是文章的 id:

使用尾部斜杠注册处理程序,以匹配前缀为“/articles/animals/”的所有路径:

mux.HandleFunc("/articles/animals/", animalHandler)

在处理程序中,剥离/articles/animals/以获取文章的 id。在数据库中查找文章。如果没有,请回复 404。

func animalHandler(w http.ResponseWriter, r *http.Request) {
  id := strings.TrimPrefix(r.URL.Path, "/articles/animals/"))
  article, err := queryArticleByID(id) 
  if err == errNotFound {
     http.Error(w, "internal error", http.StatusNotFound)
     return
  } else if err != nil {
     log.Println(err)
     http.Error(w, "internal error", http.StatusInternalError)
  }
  ... render the article
}

此示例假定该queryArticleByID()函数查询数据库并errNotFound在给定 id 不存在文章时返回。

关于缓存:queryArticleByID()可以在查询数据库之前检查缓存。任何缓存都与路由的处理方式无关。

于 2017-11-07T01:02:52.027 回答