我正在制作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 fileserver dir函数如果是这样,对于数据库,这是否意味着每次访问页面时都必须查询数据库?或者您是否将文章列表存储在文件或其他内容中,并在每次制作新文章时更新它?
另外,我打算使用https://github.com/julienschmidt/httprouter或类似的。
答案 0 :(得分:1)
以下是使用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()
可以在查询数据库之前检查缓存。任何缓存都与路由的处理方式无关。