review 错误语句
This commit is contained in:
6
3.4.md
6
3.4.md
@@ -39,7 +39,7 @@ Go在等待客户端请求里面是这样写的:
|
||||
ServeHTTP(ResponseWriter, *Request) // 路由实现器
|
||||
}
|
||||
|
||||
handler是一个接口,但是我们定义的函数`sayhelloName`没有实现ServeHTTP这个接口,为什么能添加呢?原来在http包里面还定义了一个类型`HandlerFunc`,我们定义的函数`sayhelloName`就是这个handlerFunc调用之后的结果,这个类型默认就实现了ServeHTTP这个接口,即我们调用了HandlerFunc(f),类似强制类型转换f成为handlerFunc类型,这样f就拥有了ServHTTP方法。
|
||||
handler是一个接口,但是前一小节中的`sayhelloName`函数并没有实现ServeHTTP这个接口,为什么能添加呢?原来在http包里面还定义了一个类型`HandlerFunc`,我们定义的函数`sayhelloName`就是这个handlerFunc调用之后的结果,这个类型默认就实现了ServeHTTP这个接口,即我们调用了HandlerFunc(f),类似强制类型转换f成为handlerFunc类型,这样f就拥有了ServHTTP方法。
|
||||
|
||||
type HandlerFunc func(ResponseWriter, *Request)
|
||||
|
||||
@@ -69,9 +69,9 @@ handler是一个接口,但是我们定义的函数`sayhelloName`没有实现Se
|
||||
return h
|
||||
}
|
||||
|
||||
原来他是根据用户请求的URL和路由器里面存储的map去匹配的,当匹配到之后返回存储的handler,然后handler实现了ServHTTP接口,调用这个ServHTTP就可以执行到相应的函数了。
|
||||
原来他是根据用户请求的URL和路由器里面存储的map去匹配的,当匹配到之后返回存储的handler,调用这个handler的ServHTTP接口就可以执行到相应的函数了。
|
||||
|
||||
通过上面这个介绍,我们了解了路由器的整个执行过程,Go其实支持外部实现的路由器,因为我们在调用`ListenAndServe`的时候,第二个参数就是Handler,只要实现了ServHTTP函数就可以。
|
||||
通过上面这个介绍,我们了解了整个路由过程,Go其实支持外部实现的路由器 `ListenAndServe`的第二个参数就是用以配置外部路由器的,它是一个Handler接口,即外部路由器只要实现了Handleer接口就可以,我们可以在自己实现的路由器的ServHTTP里面实现自定义路由功能。
|
||||
|
||||
如下代码所示,我们自己实现了一个简易的路由器
|
||||
|
||||
|
||||
4
3.5.md
4
3.5.md
@@ -1,7 +1,7 @@
|
||||
#3.5小结
|
||||
这一章我们通过介绍Web工作方式介绍了HTTP协议的相关信息,通过类比引出了Go怎么运行Web,实现了Go的web服务器,通过对Go运行Web的代码进行分析,深入了解了Go执行Web的整个流程,最后我们对Go语言的http包进行了详细的分析。
|
||||
这一章我们介绍了HTTP协议, DNS解析的过程, 如何用go实现一个简陋的web server。并深入到net/http包的源码中为大家揭开如何实现此server的秘密。
|
||||
|
||||
通过这一章的学习我希望你能够对Go开发Web有了初步的了解,我们也看到相应的代码了,这个开发是很方便的,同时又是相当的灵活。
|
||||
我希望通过这一章的学习,你能够对Go开发Web有了初步的了解,我们也看到相应的代码了,Go开发Web应用是很方便的,同时又是相当的灵活。
|
||||
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
|
||||
76
4.1.md
76
4.1.md
@@ -12,27 +12,27 @@
|
||||
|
||||
http包里面有一个很简单的方式就可以获取,我们在前面web的例子基础之上来看看怎么处理login,怎么读取form数据
|
||||
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"log"
|
||||
)
|
||||
|
||||
func sayhelloName(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm() //解析参数,默认是不会解析的
|
||||
fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
|
||||
fmt.Println("path", r.URL.Path)
|
||||
fmt.Println("scheme", r.URL.Scheme)
|
||||
fmt.Println(r.Form["url_long"])
|
||||
for k, v := range r.Form {
|
||||
fmt.Println("key:", k)
|
||||
fmt.Println("val:", strings.Join(v, ""))
|
||||
}
|
||||
fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"log"
|
||||
)
|
||||
|
||||
func sayhelloName(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm() //解析参数,默认是不会解析的
|
||||
fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
|
||||
fmt.Println("path", r.URL.Path)
|
||||
fmt.Println("scheme", r.URL.Scheme)
|
||||
fmt.Println(r.Form["url_long"])
|
||||
for k, v := range r.Form {
|
||||
fmt.Println("key:", k)
|
||||
fmt.Println("val:", strings.Join(v, ""))
|
||||
}
|
||||
fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
|
||||
}
|
||||
|
||||
func login(w http.ResponseWriter, r *http.Request){
|
||||
@@ -42,21 +42,21 @@ http包里面有一个很简单的方式就可以获取,我们在前面web的
|
||||
}else{
|
||||
//请求的是登陆数据,那么执行登陆的逻辑判断
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
}
|
||||
|
||||
func main() {
|
||||
http.HandleFunc("/", sayhelloName) //设置访问的路由
|
||||
http.HandleFunc("/login", login) //设置访问的路由
|
||||
err := http.ListenAndServe(":9090", nil) //设置监听的端口
|
||||
if err != nil {
|
||||
log.Fatal("ListenAndServe: ", err)
|
||||
}
|
||||
http.HandleFunc("/login", login) //设置访问的路由
|
||||
err := http.ListenAndServe(":9090", nil) //设置监听的端口
|
||||
if err != nil {
|
||||
log.Fatal("ListenAndServe: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
上面的代码我们可以看出来获取请求方法的是`r.Method`,这个是字符串类型,返回GET, POST, PUT等method信息.
|
||||
通过上面的代码我们可以看出获取请求方法是通过`r.Method`来完成的,这是个字符串类型的变量,返回GET, POST, PUT等method信息.
|
||||
|
||||
`r.Form`里面包含了所有请求的URL中query-string、POST的数据、PUT的数据,所有当你在URL的query-string字段和POST冲突时,会保存成一个slice,里面存储了多个值,Go官方说这个在接下来的版本里面会把POST、GET这些数据分离开来。
|
||||
`r.Form`里面包含了所有请求的URL中query-string、POST的数据、PUT的数据,所有当你在URL的query-string字段和POST冲突时,会保存成一个slice,里面存储了多个值,Go官方文档中说在接下来的版本里面将会把POST、GET这些数据分离开来。
|
||||
|
||||
`r.Form`是一个url.Values类型,里面存储的是对应的key=value信息,下面展示了可以对form进行的一些操作,
|
||||
|
||||
@@ -70,12 +70,12 @@ http包里面有一个很简单的方式就可以获取,我们在前面web的
|
||||
fmt.Println(v.Get("friend"))
|
||||
fmt.Println(v["friend"])
|
||||
|
||||
默认情况下,Handler里面是不会自动解析form的,必须显示的调用`r.ParseForm()`,那么你才能对这个参数进行操作。
|
||||
默认情况下,Handler里面是不会自动解析form的,必须显示的调用`r.ParseForm()`后,你才能对这个参数进行操作。
|
||||
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
* 上一节: [表单](<4.md>)
|
||||
* 下一节: [验证表单的输入](<4.2.md>)
|
||||
|
||||
## LastModified
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
* 上一节: [表单](<4.md>)
|
||||
* 下一节: [验证表单的输入](<4.2.md>)
|
||||
|
||||
## LastModified
|
||||
* $Id$
|
||||
30
4.md
30
4.md
@@ -8,22 +8,22 @@
|
||||
* 5. [处理文件上传](4.5.md)
|
||||
* 6. [小结](4.6.md)
|
||||
|
||||
表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器端进行数据的交流。对于以前开发过Web的用户来说表单都非常熟悉,但是对于C/C++程序员来说,这是个很陌生的东西,那么什么是表单呢?
|
||||
|
||||
表单是一个包含表单元素的区域。表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入信息的元素。表单使用表单标签(\<form\>)定义。
|
||||
|
||||
<form>
|
||||
...
|
||||
input 元素
|
||||
...
|
||||
表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进行数据的交互。对于以前开发过Web的用户来说表单都非常熟悉,但是对于C/C++程序员来说,这可能是一个有些陌生的东西,那么什么是表单呢?
|
||||
|
||||
表单是一个包含表单元素的区域。表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入信息的元素。表单使用表单标签(\<form\>)定义。
|
||||
|
||||
<form>
|
||||
...
|
||||
input 元素
|
||||
...
|
||||
</form>
|
||||
|
||||
Go里面对于form处理已经有很方便的方法了,在Request里面的有专门的form处理,可以很方便的整合到Web开发里面来,4.1小节里面讲讲解Go如何处理表单的输入。但是对于表单中用户输入的信息那么容易就引入到程序中来,由于不能信任任何用户的输入,所以我们需要对这些输入进行有效的验证,4.2小节就讲如何进行一些普通的验证进行详细的演示。
|
||||
|
||||
HTTP协议是一种无状态的协议,那么如何才能辨别是同一个用户呢?同时又如何保证一个表单不出现多次递交的情况呢?4.3和4.4小节里面讲对cookie等进行详细讲解。
|
||||
|
||||
表单还有一个很大的功能就是能够上传文件,那么Go是如何处理文件上传的呢?针对大文件上传我们如何有效的处理呢?4.5小节讲带领你学习Go处理文件上传的功能。
|
||||
|
||||
|
||||
Go里面对于form处理已经有很方便的方法了,在Request里面的有专门的form处理,可以很方便的整合到Web开发里面来,4.1小节里面将讲解Go如何处理表单的输入。由于不能信任任何用户的输入,所以我们需要对这些输入进行有效性验证,4.2小节将就如何进行一些普通的验证进行详细的演示。
|
||||
|
||||
HTTP协议是一种无状态的协议,那么如何才能辨别是否是同一个用户呢?同时又如何保证一个表单不出现多次递交的情况呢?4.3和4.4小节里面将对cookie(cookie是存储在客户端的信息,能够每次通过header和服务器进行交互的数据)等进行详细讲解。
|
||||
|
||||
表单还有一个很大的功能就是能够上传文件,那么Go是如何处理文件上传的呢?针对大文件上传我们如何有效的处理呢?4.5小节我们将一起学习Go处理文件上传的知识。
|
||||
|
||||
|
||||
## links
|
||||
* [目录](<preface.md>)
|
||||
|
||||
Reference in New Issue
Block a user