【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并发编程实战》清华大学出版社
相关文章
|
1月前
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
使用Java创建集成JACOB的HTTP服务
|
2月前
|
JSON 安全 前端开发
类型安全的 Go HTTP 请求
类型安全的 Go HTTP 请求
|
2月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
17天前
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
12 2
|
1月前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
17天前
http数据包抓包解析课程笔记
http数据包抓包解析课程笔记
|
2月前
|
安全 Go Docker
Go服务Docker Pod不断重启排查和解决
该文章分享了Go服务在Docker Pod中不断重启的问题排查过程和解决方案,识别出并发写map导致fatal error的问题,并提供了使用sync.Map或concurrent-map库作为并发安全的替代方案。
32 4
|
2月前
|
数据采集 缓存 IDE
Go中遇到http code 206和302的获取数据的解决方案
文章提供了解决Go语言中处理HTTP状态码206(部分内容)和302(重定向)的方案,包括如何获取部分数据和真实请求地址的方法,以便程序员能快速完成工作,享受七夕时光。
105 0
Go中遇到http code 206和302的获取数据的解决方案
|
2月前
|
运维 监控 程序员
Go 服务自动收集线上问题现场
Go 服务自动收集线上问题现场
|
2月前
|
负载均衡 中间件 Go
五分钟给你的 gRPC 服务加上 HTTP 接口
五分钟给你的 gRPC 服务加上 HTTP 接口

热门文章

最新文章