mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 02:35:53 +08:00
Improve chapter 15 3 (#694)
* improve chapter 15.3 * improve chapter 15.5 * improve chapter 15.6
This commit is contained in:
@@ -123,7 +123,7 @@ func main() {
|
||||
* `http.Redirect(w ResponseWriter, r *Request, url string, code int)`:这个函数会让浏览器重定向到 `url`(可以是基于请求 url 的相对路径),同时指定状态码。
|
||||
* `http.NotFound(w ResponseWriter, r *Request)`:这个函数将返回网页没有找到,HTTP 404错误。
|
||||
* `http.Error(w ResponseWriter, error string, code int)`:这个函数返回特定的错误信息和 HTTP 代码。
|
||||
* 另 `http.Request` 对象的一个重要属性 `req`:`req.Method`,这是一个包含 `GET` 或 `POST` 字符串,用来描述网页是以何种方式被请求的。
|
||||
* 另一个 `http.Request` 对象 `req` 的重要属性:`req.Method`,这是一个包含 `GET` 或 `POST` 字符串,用来描述网页是以何种方式被请求的。
|
||||
|
||||
go为所有的HTTP状态码定义了常量,比如:
|
||||
```go
|
||||
|
@@ -95,4 +95,4 @@ func logPanics(function HandleFnc) HandleFnc {
|
||||
|
||||
- [目录](directory.md)
|
||||
- 上一节:[写一个简单的网页应用](15.4.md)
|
||||
- 下一节:[用模板写网页应用](15.6.md)
|
||||
- 下一节:[用模板编写网页应用](15.6.md)
|
||||
|
@@ -118,7 +118,7 @@ func load(title string) (*Page, error) {
|
||||
|
||||
让我们来通读代码:
|
||||
|
||||
- 首先导入必要的包。由于我们在构建网页服务器,`http` 当然是必须的。不过还导入了 `io/ioutil` 来方便地读写文件,`regexp` 用于验证输入标题,以及 `tremplate` 来动态创建 html 文档。
|
||||
- 首先导入必要的包。由于我们在构建网页服务器,`http` 当然是必须的。不过还导入了 `io/ioutil` 来方便地读写文件,`regexp` 用于验证输入标题,以及 `template` 来动态创建 html 文档。
|
||||
- 为避免黑客构造特殊输入攻击服务器,我们用如下正则表达式检查用户在浏览器上输入的 URL(同时也是 wiki 页面标题):
|
||||
```go
|
||||
var titleValidator = regexp.MustCompile("^[a-zA-Z0-9]+$")
|
||||
@@ -146,7 +146,7 @@ func load(title string) (*Page, error) {
|
||||
它基于模板执行,用 `Page` 结构体对象 p 作为参数对模板进行替换,并写入 `ResponseWriter` 对象 w。必须检查该方法的 error 返回值,万一有一个或多个错误,我们可以调用 `http.Error` 来明示。在我们的应用程序中,这段代码会被多次调用,所以把它提取为单独的函数 `renderTemplate`。
|
||||
- 在 `main()` 中网页服务器用 `ListenAndServe` 启动并监听 8080 端口。但正如 [15.2节](15.2.md) 那样,需要先为紧接在 URL `localhost:8080/` 之后, 以`view`, `edit` 或 `save` 开头的 url 路径定义一些处理函数。在大多数网页服务器应用程序中,这形成了一系列 URL 路径到处理函数的映射,类似于 Ruby 和 Rails,Django 或 ASP.NET MVC 这样的 MVC 框架中的路由表。请求的 URL 与这些路径尝试匹配,较长的路径被优先匹配。如不与任何路径匹配,则调用 / 的处理程序。
|
||||
|
||||
在此定义了 3 个处理函数,由于包含重复的启动代码,我们将其提取到单独的 `markHandler` 函数中。这是一个值得研究的特殊高阶函数:其参数是一个函数,返回一个新的闭包函数:
|
||||
在此定义了 3 个处理函数,由于包含重复的启动代码,我们将其提取到单独的 `makeHandler` 函数中。这是一个值得研究的特殊高阶函数:其参数是一个函数,返回一个新的闭包函数:
|
||||
```go
|
||||
func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
|
Reference in New Issue
Block a user