review 错误语句

This commit is contained in:
astaxie
2012-09-06 14:33:00 +08:00
parent 4328ef4372
commit 2a33e481b3
4 changed files with 58 additions and 58 deletions

6
3.4.md
View File

@@ -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调用这个handlerServHTTP接口就可以执行到相应的函数了。
通过上面这个介绍,我们了解了路由器的整个执行过程Go其实支持外部实现的路由器,因为我们在调用`ListenAndServe`时候,第二个参数就是Handler只要实现了ServHTTP函数就可以
通过上面这个介绍,我们了解了整个路由过程Go其实支持外部实现的路由器 `ListenAndServe`的第二个参数就是用以配置外部路由器的它是一个Handler接口即外部路由器只要实现了Handleer接口就可以,我们可以在自己实现的路由器的ServHTTP里面实现自定义路由功能
如下代码所示,我们自己实现了一个简易的路由器

4
3.5.md
View File

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

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

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