From 76129ffbb646f59c0cc92a13453e2f5cfdf1f164 Mon Sep 17 00:00:00 2001 From: glight2000 <173959153@qq.com> Date: Wed, 9 Dec 2015 23:09:26 +0800 Subject: [PATCH] Update 15.2.md --- eBook/15.2.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/eBook/15.2.md b/eBook/15.2.md index 17ea62c..15057f8 100644 --- a/eBook/15.2.md +++ b/eBook/15.2.md @@ -5,6 +5,28 @@ Http是一个比tcp更高级的协议,它描述了客户端浏览器如何与 我们引入了`http`包并启动了网页服务器,和15.1的`net.Listen("tcp", "localhost:50000")`函数的tcp服务器是类似的,使用`http.ListenAndServe("localhost:8080", nil)`函数,如果成功会返回空,否则会返回一个错误(可以指定localhost为其他地址,8080是指定的端口号) +`http.URL`描述了web服务器的地址,内含存放了url字符串的`Path`属性;`http.Request`描述了客户端请求,内含一个`URL`属性 + +如果`req`请求是一个POST类型的html表单,“var1”就是html表单中一个输入属性的名称,然后用户输入的值就可以通过GO代码:`req.FormValue("var1")`获取到(请看[章节15.4](15.4.md))。还有一种方法就是先执行`request.ParseForm()`然后再获取`request.Form["var1"]的第一个返回参数,就像这样: +```go + var1, found := request.Form["var1"] +``` +第二个参数`found`就是`true`,如果`var1`并未出现在表单中,`found`就是`false` + +表单属性实际上是一个`map[string][]string`类型。网页服务器返回了一个`http.Response`,它是通过`http.ResponseWriter`对象输出的,这个对象整合了HTTP服务器的返回结果;通过对它写入内容,我们就讲数据发送给了HTTP客户端。 + +现在我们还需要编写网页服务器必须执行的程序,它是如何处理请求的呢。这是在`http.HandleFunc`函数中完成的,就是在这个例子中当根路径“/”(url地址是http://localhost:8080)被请求的时候(或者这个服务器上的其他地址),`HelloServer`函数就被执行了。这个函数是`http.HandlerFunc`类型的,它们通常用使用Prehandler来命名,在前边加了一个Pref前缀。 + +`http.HandleFunc`注册了一个处理函数(这里是`HelloServer`)来处理对应`/`的请求。 + +`/`可以被替换为其他特定的url比如`/create`,`/edit`等等;你可以为每一个特定的url定义一个单独的处理函数。这个函数需要两个参数:第一个是`ReponseWriter`类型的`w`;第二个是请求`req`。程序向`w`写入了`Hello`和`r.URL.Path[1:]`组成的字符串后边的`[1:]`表示“创建一个从第一个字符到结尾的子切片”,用来丢弃掉路径开头的“/”,`fmt.Fprintf()`函数完成了本次写入(请看[章节12.8](12.8.md));另外一种写法是`io.WriteString(w, "hello, world!\n")` + +总结:第一个参数是请求的路径,第二个参数是处理这个路径请求的函数的引用。 + +示例 15.6 [hello_world_webserver.go](examples/chapter_15/hello_world_webserver.go): +```go +``` + ## 链接