第十九章修改 (#832)

Co-authored-by: Joe Chen <jc@unknwon.io>
This commit is contained in:
Haigang Zhou
2022-05-19 20:00:29 +08:00
committed by GitHub
parent fa1cfcc67f
commit 800466becd
9 changed files with 82 additions and 71 deletions

View File

@@ -34,7 +34,7 @@ func main() {
`Add` 函数必须做的事有:
1. 读取长 URL`r.FormValue("url")` 从 HTML 表单提交的 HTTP 请求中读取 URL
2. 使用 store 上的 `Put` 方法存储长 URL
2. 使用 store 上的 `Put()` 方法存储长 URL
3. 将对应的短 URL 发送给用户
每个需求都转化为一行代码:
@@ -46,9 +46,9 @@ func Add(w http.ResponseWriter, r *http.Request) {
}
```
这里 `fmt` 包的 `Fprintf` 函数用来替换字符串中的关键字 `%s`,然后将结果作为响应发送回客户端。注意 `Fprintf` 把数据写到了 `ResponseWriter` 中,其实 `Fprintf` 可以将数据写到任何实现了 `io.Writer` 的数据结构,即该结构实现了 `Write` 方法。Go 中 `io.Writer` 称为接口,可见 `Fprintf` 利用接口变得十分通用可以对很多不同的类型写入数据。Go 中接口的使用十分普遍,它使代码更通用(见 [11 章](11.0.md))。
这里 `fmt` 包的 `Fprintf()` 函数用来替换字符串中的关键字 `%s`,然后将结果作为响应发送回客户端。注意 `Fprintf()` 把数据写到了 `ResponseWriter` 中,其实 `Fprintf()` 可以将数据写到任何实现了 `io.Writer` 的数据结构,即该结构实现了 `Write()` 方法。Go 中 `io.Writer` 称为接口,可见 `Fprintf()` 利用接口变得十分通用可以对很多不同的类型写入数据。Go 中接口的使用十分普遍,它使代码更通用(见 [11 章](11.0.md))。
还需要一个表单,仍然可以用 `Fprintf` 来输出,这次将常量写入 `w`。让我们来修改 `Add`,当未指定 URL 时显示 HTML 表单:
还需要一个表单,仍然可以用 `Fprintf()` 来输出,这次将常量写入 `w`。让我们来修改 `Add()`,当未指定 URL 时显示 HTML 表单:
```go
func Add(w http.ResponseWriter, r *http.Request) {
url := r.FormValue("url")
@@ -68,9 +68,10 @@ URL: <input type="text" name="url">
`
```
在那种情况下,发送字符串常量 `AddForm` 到客户端,它是 html 表单,包含一个 `url` 输入域和一个提交按钮,点击后发送 POST 请求到 `/add`。这样 `Add` 处理函数被再次调用,此时 `url` 的值来自文本域。(` `` ` 用来创建原始字符串,否则按惯例 `""` 将成为字符串边界。)
在那种情况下,发送字符串常量 `AddForm` 到客户端,它是 html 表单,包含一个 `url` 输入域和一个提交按钮,点击后发送 POST 请求到 `/add`。这样 `Add()` 处理函数被再次调用,此时 `url` 的值来自文本域。(` `` ` 用来创建原始字符串,否则按惯例 `""` 将成为字符串边界。)
`Redirect()` 函数在 HTTP 请求路径中找到键(短 URL 的键是请求路径去除首字符,在 Go 中可以写为 `[1:]`。例如请求 "/abc",键就是 "abc"),用 `Get()` 函数从 `store` 检索到对应的长 URL对用户发送 HTTP 重定向。如果没找到 URL发送 404 "Not Found" 错误取而代之:
`Redirect` 函数在 HTTP 请求路径中找到键(短 URL 的键是请求路径去除首字符,在 Go 中可以写为 `[1:]`。例如请求 "/abc",键就是 "abc"),用 `Get` 函数从 `store` 检索到对应的长 URL对用户发送 HTTP 重定向。如果没找到 URL发送 404 "Not Found" 错误取而代之:
```go
func Redirect(w http.ResponseWriter, r *http.Request) {
key := r.URL.Path[1:]
@@ -83,7 +84,7 @@ func Redirect(w http.ResponseWriter, r *http.Request) {
}
```
`http.NotFound``http.Redirect` 是发送通用 HTTP 响应的工具函数。)
`http.NotFound()``http.Redirect()` 是发送通用 HTTP 响应的工具函数。)
我们已经完整地遍历了 [goto_v1](examples/chapter_19/goto_v1) 的代码。
@@ -103,7 +104,7 @@ func Redirect(w http.ResponseWriter, r *http.Request) {
打开浏览器并请求 url`http://localhost:8080/add`
这会激活 `Add` 处理函数。请求还未包含 url 变量,所以响应会输出 html 表单询问输入:
这会激活 `Add()` 处理函数。请求还未包含 url 变量,所以响应会输出 html 表单询问输入:
![](images/19.4_fig19.2.png?raw=true)
@@ -112,7 +113,7 @@ localhost:8080/2`。
![](images/19.4_fig19.3.jpg?raw=true)
复制该 URL 并在浏览器地址栏粘贴以发出请求,现在轮到 `Redirect` 处理函数上场了,对应长 URL 的页面被显示了出来。
复制该 URL 并在浏览器地址栏粘贴以发出请求,现在轮到 `Redirect()` 处理函数上场了,对应长 URL 的页面被显示了出来。
![](images/19.4_fig19.4.jpg?raw=true)