Improve chapter 15 3 (#694)

* improve chapter 15.3

* improve chapter 15.5

* improve chapter 15.6
This commit is contained in:
marjune
2019-07-25 08:19:30 +08:00
committed by ᴊ. ᴄʜᴇɴ
parent cbf71ac059
commit 93401d1790
3 changed files with 4 additions and 4 deletions

View File

@@ -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

View File

@@ -95,4 +95,4 @@ func logPanics(function HandleFnc) HandleFnc {
- [目录](directory.md)
- 上一节:[写一个简单的网页应用](15.4.md)
- 下一节:[用模板写网页应用](15.6.md)
- 下一节:[用模板写网页应用](15.6.md)

View File

@@ -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 和 RailsDjango 或 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) {