如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了。

我们先看个例子:http.go

package mainimport ("fmt""io""log""net/http"
)func main() {http.HandleFunc("/test", doRequest)      //   设置访问路由err := http.ListenAndServe(":8000", nil) //设置监听的端口if err != nil {log.Fatal("ListenAndServe: ", err)}
}func doRequest(w http.ResponseWriter, r *http.Request) {r.ParseForm()       //解析url传递的参数,对于POST则解析响应包的主体(request body)//fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息//fmt.Println("path", r.URL.Path)//fmt.Println("scheme", r.URL.Scheme)//for k, v := range r.Form {//    fmt.Println("key:", k)//    fmt.Println("value:", strings.Join(v, ""))//}fmt.Fprintf(w, "service start...") //这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象//注意:如果没有调用ParseForm方法,下面无法获取表单的数据//query := r.URL.Query()var uid string // 初始化定义变量if r.Method == "GET" {uid = r.FormValue("uid")} else if r.Method == "POST" {uid = r.PostFormValue("uid")}io.WriteString(w, "uid = "+uid)
}

go run http.go命令运行程序。
之后在浏览器中输入地址: http://127.0.0.1:8000/test?uid=10086,看下结果。

  在main函数中,我们从net/http包中调用了一个http.HandleFucn函数来注册一个处理函数

这个函数接受两个参数。第一个是字符串,这个就是进行路由匹配,我这里是/test路由。第二个参数是一个func (ResponseWriter, Request)的签名。

我们的doRequest函数就是这样的签名。下一行中的http.ListenAndServe(":8000", nil),表示监听localhost的8000端口,暂时忽略掉nil。

   在doRequest函数中我们有两个参数,一个是http.ResponseWriter类型的。它类似响应流,实际上是一个接口类型。

第二个是http.Request类型,类似于HTTP 请求。我们不必使用所有的参数,如果只是简单的输出,那么我们只需要使用http.ResponseWriter,io.WriteString,将会把输出流写入数据。

我们再稍微改下,大家请注意修改的部分(这里我们只调整 main函数部分代码)

func main() {mux := http.NewServeMux()mux.HandleFunc("/test", doRequest)err :=  http.ListenAndServe(":8000", mux) //设置监听的端口if err != nil {log.Fatal("ListenAndServe: ", err)}
}

这个例子中,我们不再在函数http.ListenAndServe使用nil了。这个例子跟上面的例子其实是一样的。使用http注册hanlder 函数模式就是用的ServeMux。
我们再调整下看下更复杂的例子:

package mainimport ("fmt""io""log""net/http"
)var mux map[string]func(http.ResponseWriter, *http.Request)func main() {server := http.Server{Addr:    ":8000",Handler: &doHandler{},}mux = make(map[string]func(http.ResponseWriter, *http.Request))mux["/test"] = doRequesterr := server.ListenAndServe()if err != nil {log.Fatal("ListenAndServe: ", err)}
}type doHandler struct{}func (*doHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {if res, ok := mux[r.URL.String()]; ok {res(w, r)return}io.WriteString(w, "url params: "+r.URL.String())
}
func doRequest(w http.ResponseWriter, r *http.Request) {r.ParseForm()                      //解析url传递的参数,对于POST则解析响应包的主体(request body)fmt.Fprintf(w, "service start...") //这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象
}

这个例子我们没有定义ServeMux,而是使用了http.Server。都是用net/http包运行了服务器。

转载于:https://www.cnblogs.com/phpper/p/10408206.html

使用Golang搭建web服务相关推荐

  1. 基于Docker和Golang搭建Web服务器

    1 场景描述 基于centos7的docker镜像搭建golang开发环境 在docker容器内,使用golang实现一个Web服务器 启动docker容器,并在容器内启动Web服务器 我购买了一个最 ...

  2. 使用 docker 搭建 web 服务环境

    本文目的 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都会具有一定的依赖性的.对于 PHP 的 Web 开发来说,开发环境至少要有一个 Web 服务器(如 Apac ...

  3. 新手如何使用docker搭建web服务环境

    做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都会具有一定的依赖性的.对于 PHP 的 Web 开发来说,开发环境至少要有一个 Web 服务器(如 Apache.Ng ...

  4. 普歌-腾讯云短信+使用node发送短信(3种方法API、SDK)、封装工具、搭建web服务、写接口、调用接口发送短信、时效性判断、验证验证码的正确性(下)

    普歌-结合腾讯云短信服务+node搭建一个简单的发送短信web小项目 涉及技术: 腾讯云服务 后端服务:node+express 前端搭建:html+js 前言:本来这篇博客应该很早就发了,中间有一些 ...

  5. tomcat搭建web服务,lrc文件下载

    对于我这个开始学.net的人来说,对tomcat所知甚少.如今在Android练习中,需要用tomcat搭建web服务,并提供文件下载.视频中老师一带而过,我那个郁闷啊.没有办法,自己倒持一下,写这篇 ...

  6. golang 简单web服务

    1.golang print输入 package mainimport "fmt"func main() {fmt.Printf("Hello World!\n" ...

  7. RHEL 5服务篇—使用Apache搭建web服务(四)部署AWStats网站分析系统

    在httpd服务器的访问日志文件access_log中,记录了大量的客户机访问信息,通过分析这些信息,可以及时了解web站点的访问情况.但是由于access_log文件记录的信息太多,查看起来很不方便 ...

  8. RHEL 5服务篇—使用Apache搭建Web服务(一)

    安装Apache服务以及了解相关的配置文件 在当今的互联网中常用的搭建web服务器的方法有两种,一种是IIS.一种是Apache.大家都知道IIS是微软的产品,只支持在windows系统上使用.那么我 ...

  9. 使用Golang搭建gRPC服务提供给.NetCore客户端调用

    gRPC概述 RPC 说到gRPC就不得不提RPC,所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,简单点来说就是我A机器 ...

最新文章

  1. gpg加密命令 linux_用 PGP 保护代码完整性(五):将子密钥移到一个硬件设备中 | Linux 中国...
  2. 2008年北大核心有效期 计算机类核心(2011-01-31 15:02:46)
  3. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!
  4. diesel fuel
  5. mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】
  6. 小程序类似抖音视频整屏切换
  7. (转)淘淘商城系列——展示后台管理页面
  8. Thread.currentThread().getContextClassLoader()和Class.getClassLoader()区别
  9. 《JAVA与模式》— 原型模式
  10. Windows下【AxureRP】原型设计工具破解码与安装包
  11. 霍尔传感器的工作原理、分类及应用
  12. 禁用deepin的搜狗输入法简繁切换快捷键
  13. naive_bayes
  14. 音视频开发——概述(含TUTK demo iOS)
  15. 查看、修改图片gps地理位置信息
  16. 【区块链 | Compound】2.剖析DeFi借贷产品之Compound:合约篇
  17. K8s 支持一键部署
  18. 创维linux怎么连接wifi,创维酷开电视多屏互动Miracast玩法详解
  19. cocos2dx之MoveTo,MoveBy
  20. 英伟达 nano 新手必读:Jetson Nano 2GB 开发者套件入门指南

热门文章

  1. Java 计算数学表达式(字符串解析求值工具)
  2. java装饰模式理解_Java设计模式之装饰模式趣谈
  3. 安装chrome插件
  4. java B2B2C 源码多租户电子商城系统-Spring Cloud整合Netflix Archaius介绍
  5. 打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。...
  6. Word中将传统的复选框型窗体域选项插件 批量替换成 复选框内容控件
  7. MyBatis教程目录
  8. Mysql 异步复制
  9. 横向滚动条并且隐藏竖向滚动条
  10. 在ECSHOP后台左侧导航中增加新菜单