golang快速入门(五)初尝web服务

zhangxiaohai · · 3552 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

**提示:本系列文章适合对Go有持续冲动的读者** #### 初探golang web服务 golang web开发是其一项重要且有竞争力的应用,本小结来看看再golang中怎么创建一个简单的web服务。 在不适用web框架的情况下,可以使用`net/http`包搭建一个web服务。 1. 这里我们使用`net/http`创建一个打印请求URL的web服务。 ```go package main import ( //"log" "fmt" "net/http" ) func main() { http.HandleFunc("/", handler) http.ListenAndServe("localhost:6677", nil) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "url.path=%q\n", r.URL.Path) //输出到文件流 } ``` `http.HandleFunc`函数可以理解为URL路由。 `http.ListenAndServe`是web服务的创建核心。 `handler`是http请求处理函数,接受一个`http.ResponseWriter`文件流 和`http.Request`类型的对象。 ```shell [root@VM-0-5-centos ~]# curl localhost:6677/123 url.path="/123" ``` --- 2. 我们通过handler函数来对访问url做访问数计算。 引入golang `sync`中的互斥锁,这样同时存在多个请求时只有一个goroutine改变count计数。互斥锁后续深入了解。 ```go package main import ( //"log" "fmt" "net/http" "sync" ) var count int var mutex sync.Mutex //使用互斥锁 func main() { http.HandleFunc("/", handler) http.ListenAndServe("localhost:6677", nil) } func handler(w http.ResponseWriter, r *http.Request) { mutex.Lock() count++ mutex.Unlock() fmt.Fprintf(w, "request url.path:%q has %d times\n", r.URL.Path, count) } ``` 我们来看看请求结果如下: ```shell [root@VM-0-5-centos ~]# curl localhost:6677/golang request url.path:"/golang" has 1 times [root@VM-0-5-centos ~]# curl localhost:6677/golang request url.path:"/golang" has 2 times [root@VM-0-5-centos ~]# curl localhost:6677/golang request url.path:"/golang" has 3 times ``` --- 3. `http.Request`类型对象除了`URL.Path`属性外还有`Method`、`Proto`等。我们通过`handler`函数分别打印出来。 ```go package main import ( //"log" "fmt" "net/http" "sync" ) var count int var mutex sync.Mutex //使用互斥锁 func main() { http.HandleFunc("/", handler) http.ListenAndServe("localhost:6677", nil) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "%s,%s,%s,\n", r.Method, r.URL, r.Proto) fmt.Fprintf(w, "host:%q\nremoteaddr:%q\n", r.Host, r.RemoteAddr) for k, v := range r.Header { fmt.Fprintf(w, "Header[%q]:%q\n", k, v) } for k, v := range r.Form { fmt.Fprintf(w, "Form[%q]:%q\n", k, v) } } ``` 创建表单接受后输出如下: ``` //output GET,/helloweb,HTTP/1.1, host:"localhost:6677" remoteaddr:"127.0.0.1:58088" Header["User-Agent"]:["curl/7.29.0"] Header["Accept"]:["*/*"] Form[parm1]:hello Form[parm2]:web ``` 本次简单的了解了一下golang web服务,也是初尝章节结束。接下来会比较深入的学习golang的精彩细节与精华。 --- 文章来源公众号【容器云实践】[golang快速入门(五)初尝web服务](https://mp.weixin.qq.com/s?__biz=MzkzNjEwNTMyNA==&mid=2247483679&idx=1&sn=5c16d48cff0f354dbc8a94e791641bdd&chksm=c2a2851cf5d50c0aa5df557291aea3852491be6eac461cb3960d70db1bf511f2172a29ac3150&token=28630524&lang=zh_CN#rd) 欢迎关注【容器云实践】,每天学点怪东西。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3552 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传