2014-02-05 wcdj
0 摘要
之前总结过如何使用Perl搭建Web服务《Web服务器的实现(最小的Perl Web服务器)》。本文介绍如何使用GoLang搭建Web服务,Go语言提供了一个完善的net/http包,通过这个http包可以很方便搭建一个可以运行的Web服务,同时使用这个包能很简单地对Web的路由,静态文件,模板,Cookie等数据进行设置和操作。
1 测试代码一
http_svr.go
package main
import (
"fmt"
"log"
"net/http"
"strings"
)
func sayhelloName(w http.ResponseWriter,r *http.Request) {
// 解析参数,默认是不会解析的
r.ParseForm()
// 这些信息是输出到服务器端的打印信息
fmt.Println("request map:",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,";"))
}
// 这个写入到w的信息是输出到客户端的
fmt.Fprintf(w,"Hello gerryyang!n")
}
func main() {
// 设置访问的路由
http.HandleFunc("/",sayhelloName)
// 设置监听的端口
err := http.ListenAndServe(":9090",nil)
if err != nil {
log.Fatal("ListenAndServe: ",err)
}
}
2 测试用例一
(1) 在浏览器输入:http://localhost:9090/,则:
浏览器输出:
Hello gerryyang!
http_svr输出:
request map: map[] path / scheme []
(2) 在终端使用curl命令测试。
curl "http://localhost:9090/?url_long=111&url_long=222&name=gerryyang&gender=male"
终端输出:
Hello gerryyang!
http_svr输出:
request map: map[url_long:[111 222] name:[gerryyang] gender:[male]] path / scheme [111 222] key: url_long val: 111;222 key: name val: gerryyang key: gender val: male
3 测试代码二
package main
import (
"fmt"
"net/http"
)
type MyMux struct {
}
func (p *MyMux) ServeHTTP(w http.ResponseWriter,r *http.Request) {
if r.URL.Path == "/" {
sayhelloName(w,r)
return
}
http.NotFound(w,r)
return
}
func sayhelloName(w http.ResponseWriter,r *http.Request) {
fmt.Fprintf(w,"Hello gerryyang,version 2!n")
}
func main() {
mux := &MyMux{}
http.ListenAndServe(":9090",mux)
}
4 测试用例二
gerryyang@mba:go_web$curl "http://localhost:9090/?url_long=111&url_long=222&name=gerryyang&gender=male"
Hello gerryyang,version 2!
gerryyang@mba:go_web$curl "http://localhost:9090/aa?url_long=111&url_long=222&name=gerryyang&gender=male"
404 page not found
5 小结
用例一,使用GoLang编写Web服务只要调用http包的两个函数,不依赖nginx,apache服务器。
6 原理分析
GoLang实现Web服务的流程如下:
(1) 创建Listen Socket,监听指定的端口,等待客户端(大黄鸭)请求到来;
(2) Listen Socket接受客户端的请求,得到Client Socket,接下来通过Client Socket与客户端通信;
(3) 处理客户端的请求,首先从Client Socket读取HTTP请求的协议头,如果是POST方法,还可能要读取客户端提交的数据,然后交给相应地handler处理请求,handler处理完毕准备好客户端需要的数据,通过Client Socket写给客户端;
7 参考
[1] Go Web编程 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|