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

我们先看个例子:http.go

package main

import (
"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 main

import (
"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"] = doRequest err := 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包运行了服务器。

使用Golang搭建web服务的更多相关文章

  1. docker 搭建 web 服务环境

    docker容器虽然早就听说过,但是本人还真的没去用过,刚好看到相关的文章,就分享了下,有机会可以实践下...... 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都 ...

  2. python3.x +django + nginx + uwsgi 搭建web服务

    最近一直在用django开发自己的网站.在开发和线上环境的对接过程中遇到了许多的坑.所以想以一个老鸟的经历来写一下怎么 搭建web服务 一.python3.x .django .nginx .uwsg ...

  3. nodejs搭建web服务教程

    nodejs搭建web服务教程 先安装nodejs 然后 命令node js文件 即可开启服务了 输出如下 Magic happens on port 9011 你查看端口可以看到tcp 0 0 :: ...

  4. 4、架构--NFS实践、搭建web服务、文件共享

    笔记 1.晨考 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些,都有哪些优点缺点 cp : 本地,全量复制 scp :远程,全量复制 rsync :远程,增量复制 3.rsync的参数 ...

  5. Win10搭建web服务实现文件共享

    配置Internet Information Services服务,实现文件共享. 1.打开控制面板,启用IIS服务. 启用IIS服务,系统会自动搜索并安装IIS服务. 2.管理web服务 此时在浏览 ...

  6. golang 简单web服务

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

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

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

  8. nginx 与 tomcat 组合搭建web服务

    部分内容转自 http://www.cnblogs.com/naaoveGIS/ 1. Web服务 nginx是常用的web服务器,用于获取静态资源,类似的服务器还有apache. tomcat是基于 ...

  9. 如何在阿里云服务器里配置iis 搭建web服务

    IIS,互联网信息服务,一种Web服务组件,利用它,我们可以打开asp.php这些搭建网页所用的文件.   工具/原料   域名 服务器 方法/步骤     登录服务器.   点击开始—>服务器 ...

随机推荐

  1. hystrix基本介绍和使用(1)

    一.hystrix基本介绍 Hystrix(https://github.com/Netflix/Hystrix)是Netflix(https://www.netflix.com/global)的一个 ...

  2. 搭建SpringCloud-Eureka 注册中心以及服务提供与调用

    纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于springcloud是什么我就不废话了~ Eureka  Eureka(原来以为是缩写,原来 ...

  3. Vue.js-10:第十章 - 组件间的数据通信

    一.前言 在上一章的学习中,我们继续学习了 Vue 中组件的相关知识,了解了在 Vue 中如何使用组件的 data.prop 选项.在之前的学习中有提到过,组件是 Vue 中的一个非常重要的概念,我们 ...

  4. python中线程和进程(二)

    目录 线程同步 Event Lock RLock Condition Barrier semaphore GIL 线程同步 线程同步,即线程之间协同工作,一个线程访问某些数据时,其他线程不能访问这些数 ...

  5. 视频当道的时代,这些珍藏的优质 Python 播客值得推荐

    我国互联网的发展道路与欧美不同,在内容的形式上,我们似乎实现了跨越式的发展——早早进入了移动互联网时代,直播和短视频等形式的内容成为了潮流,而文字形式的博客(blog)与声音形式的播客(podcast ...

  6. python爬虫踩坑教程

    我们的目标是爬取下面这个个网址上的2010~2018年的数据 http://stockdata.stock.hexun.com/zrbg/Plate.aspx?date=2015-12-31 获取我们 ...

  7. 设计模式 | 策略模式(strategy)

    参考:https://www.cnblogs.com/lewis0077/p/5133812.html(深入解析策略模式) 定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相 ...

  8. AI2(App Inventor 2)离线版服务器网络版

    个人修改包括: 1.后台增加用户批量添加功能         https://gte.fsyz.net/node/1877 2.上传文件限制改为100M ,编译文件限制改为10M      https ...

  9. goldengate同源一目标+多表和同源多目标+多表

    小结一下,永记心中!几经修改,看见完美曾经遇到的问题或值得注意的地方,就此记录一下,以免再犯开始...******************同源一目标+多表******************针对部分表 ...

  10. 一条SQL生成数据字典

    有个字典表并定期维护,对DBA和开发很重要,终于把他们整合在一起了,看有没问题? 一条SQL生成数据字典,包含所有OPEN用户.表名.字段名.字段序号.字段属性.默认值.是否非空.字段意思.主键标识. ...