【go笔记】简单的http服务

简介: 【go笔记】简单的http服务

前言

Go语言通过内置的标准库net/http可以非常方便地实现web服务。不借助任何框架,单凭标准库,50行代码内即可实现简单的web服务。

http的ListenAndServe()函数原型:

func ListenAndServe(addr string, handler Handler) error {
  server := &Server{Addr: addr, Handler: handler}
  return server.ListenAndServe()
}

ListenAndServe()函数用于在特定的TCP网络地址addr上监听,然后调用服务端处理程序handler来处理传入的接入请求。handler通常为nil,这意味着服务端调用默认的DefaultServeMux。默认的DefaultServeMux会自动注册用户定义的客户端逻辑处理程序。比如http.HandleFunc

示例代码:server.go

package main
import (
  "fmt"
  "net/http"
)
func MyHandler(w http.ResponseWriter, r *http.Request) {
  if r.Method == "GET" {
    // 通过 r.URL.Query()获取客户端请求的Query参数
    vars := r.URL.Query()
    // 获取Query键为key的参数值
    key, ok := vars["key"]
    // 如果获取到,打印 hello get ...
    if ok {
      msg := "hello get " + key[0]
      // w.Write() 将数据返回给客户端
      // 因为 msg 是字符串类型,因此需要强制进行类型转换
      w.Write([]byte(msg))
    } else {
      // 如果没获取到,则打印 hello world
      w.Write([]byte("hello world!"))
    }
  }
  if r.Method == "POST" {
    r.ParseForm()
    key := r.Form.Get("name")
    msg := "hello post " + key
    w.Write([]byte(msg))
  }
}
func main() {
  // 路由请求处理函数
  http.HandleFunc("/", MyHandler)
  // 在0.0.0.0:8000监听请求
  // 第二个参数nil意味着服务端调用默认的DefaultServeMux处理客户端请求
  err := http.ListenAndServe("0.0.0.0:8000", nil)
  if err != nil {
    fmt.Println(err)
  }
}

示例代码:client.go

package main
import (
  "fmt"
  "io/ioutil"
  "net/http"
  "strings"
)
func httpGet() {
  resp, err := http.Get("http://127.0.0.1:8000?key=python")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer resp.Body.Close()
  body, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(body))
}
func httpPost() {
  resp, err := http.Post("http://127.0.0.1:8000", "application/x-www-form-urlencoded", strings.NewReader("name=Go"))
  if err != nil {
    fmt.Println(err)
    return
  }
  defer resp.Body.Close()
  body, err := ioutil.ReadAll(resp.Body)
  fmt.Println(string(body))
}
func main() {
  httpGet()
  httpPost()
}

其它

  • http/2:所有数据以二进制形式传输,支持多路复用、服务器推送和Header信息压缩

参考文档

  • 汪明 - 《Go并发编程实战》清华大学出版社
相关文章
|
2月前
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
使用Java创建集成JACOB的HTTP服务
|
6天前
|
Go UED
Go Web服务中如何优雅平滑重启?
在生产环境中,服务升级时如何确保不中断当前请求并应用新代码是一个挑战。本文介绍了如何使用 Go 语言的 `endless` 包实现服务的优雅重启,确保在不停止服务的情况下完成无缝升级。通过示例代码和测试步骤,详细展示了 `endless` 包的工作原理和实际应用。
22 3
|
14天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
43 13
|
7天前
|
JSON Go UED
Go Web服务中如何优雅关机?
在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
14 1
|
1月前
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
17 2
|
2月前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
http数据包抓包解析课程笔记
http数据包抓包解析课程笔记
|
3月前
|
数据采集 缓存 IDE
Go中遇到http code 206和302的获取数据的解决方案
文章提供了解决Go语言中处理HTTP状态码206(部分内容)和302(重定向)的方案,包括如何获取部分数据和真实请求地址的方法,以便程序员能快速完成工作,享受七夕时光。
166 0
Go中遇到http code 206和302的获取数据的解决方案
|
3月前
|
运维 监控 程序员
Go 服务自动收集线上问题现场
Go 服务自动收集线上问题现场
|
3月前
|
负载均衡 中间件 Go
五分钟给你的 gRPC 服务加上 HTTP 接口
五分钟给你的 gRPC 服务加上 HTTP 接口