mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-11-13 17:36:12 +08:00
@@ -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 表单询问输入:
|
||||
|
||||

|
||||
|
||||
@@ -112,7 +113,7 @@ localhost:8080/2`。
|
||||
|
||||

|
||||
|
||||
复制该 URL 并在浏览器地址栏粘贴以发出请求,现在轮到 `Redirect` 处理函数上场了,对应长 URL 的页面被显示了出来。
|
||||
复制该 URL 并在浏览器地址栏粘贴以发出请求,现在轮到 `Redirect()` 处理函数上场了,对应长 URL 的页面被显示了出来。
|
||||
|
||||

|
||||
|
||||
|
||||
Reference in New Issue
Block a user