前言

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并发编程实战》清华大学出版社

【go笔记】简单的http服务的更多相关文章

  1. Netty4.0学习笔记系列之三:构建简单的http服务(转)

    http://blog.csdn.net/u013252773/article/details/21254257 本文主要介绍如何通过Netty构建一个简单的http服务. 想要实现的目的是: 1.C ...

  2. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  3. 《Linux就该这么学》培训笔记_ch11_使用Vsftpd服务传输文件

    <Linux就该这么学>培训笔记_ch11_使用Vsftpd服务传输文件 文章最后会post上书本的笔记照片. 文章主要内容: 文件传输协议 Vsftpd服务程序 匿名访问模式 本地用户模 ...

  4. 《Linux就该这么学》培训笔记_ch17_使用iSCSI服务部署网络存储

    <Linux就该这么学>培训笔记_ch17_使用iSCSI服务部署网络存储 文章最后会post上书本的笔记照片. 文章主要内容: iSCSI技术介绍 创建RAID磁盘阵列 配置iSCSI服 ...

  5. 通过HttpListener实现简单的Http服务

    使用HttpListener实现简单的Http服务 HttpListener提供一个简单的.可通过编程方式控制的 HTTP 协议侦听器.使用它可以很容易的提供一些Http服务,而无需启动IIS这类大型 ...

  6. 树莓派(Raspberry Pi)搭建简单的lamp服务

    树莓派(Raspberry Pi)搭建简单的lamp服务: 1. LAMP 的安装 sudo apt-get install apache2 mysql-server mysql-client php ...

  7. WCF-学习笔记概述之计算服务(1)

    关于WCF的介绍,在此不再赘述,其他地方应有尽有.直接开始实例,第一个实例以一个简单的计算服务为例,本人是学习了蒋金楠的<WCF全面解析>. 1.构建解决方案 Interface:用于定义 ...

  8. 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

    构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...

  9. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...

  10. 简单ESB的服务架构

    简单ESB的服务架构 这几个月一直在修改架构,所以迟迟没有更新博客. 新的架构是一个基于简单esb的服务架构,主要构成是esb服务注册,wcf服务,MVC项目构成. 首先,我门来看一看解决方案, 1. ...

随机推荐

  1. 消息推送平台的实时数仓?!flink消费kafka消息入到hive

    大家好,3y啊.好些天没更新了,并没有偷懒,只不过一直在安装环境,差点都想放弃了. 上一次比较大的更新是做了austin的预览地址,把企业微信的应用和机器人消息各种的消息类型和功能给完善了.上一篇文章 ...

  2. python Unitest和pytest 介绍和安装

    前言 目前有两种纯测试的测试框架,pytest和unittest,这系列文章主要介绍pytest为主 UnitTest测试框架理论 python 自带的单元测试框架,常用在单元测试 在自动化测试中提供 ...

  3. 2021-03-24:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的。返回其长度。

    2021-03-24:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的.返回其长度. 福大大 答案20 ...

  4. vue全家桶进阶之路11:计算属性

    Vue2 中的计算属性是指在组件中声明的计算属性,它们的值是根据其他数据计算得出的,并且会根据依赖数据的变化而自动更新.计算属性可以在模板中使用,与普通属性一样使用,但是它们具有以下优点: 缓存:计算 ...

  5. UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list

    错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_l ...

  6. 【实践篇】教你玩转JWT认证---从一个优惠券聊起

    引言 最近面试过程中,无意中跟候选人聊到了JWT相关的东西,也就联想到我自己关于JWT落地过的那些项目. 关于JWT,可以说是分布式系统下的一个利器,我在我的很多项目实践中,认证系统的第一选择都是JW ...

  7. Qt数据可视化项目

    一.创建项目(步骤按常规来即可) 二.ui设计界面 控件的使用 默认视角:Label标签和horizontalSlider标签 水平旋转:Label标签和horizontalSlider标签 垂直旋转 ...

  8. .Net8顶级技术:IR边界检查之IR解析(二)

    前言 IR技术应用在各个编程语言当中,它属于JIT的核心部分,确实有点点麻烦.但部分基本明了.本篇通过小例子了解下.前情提要,看这一篇之前建议看看前一篇:点击此处,以便于理解. 概括 1.前奏 先上C ...

  9. 公众号接入 ChatGPT 了!

    虽迟但到,用了一段时间的chatgpt,功能确实令人惊叹,也是第一次体验到了交互式编程.不得不说,未来已来,花了一些时间,终于把chatgpt接入到了公众号! 使用方法 打开公众号的对话框,直接提问! ...

  10. 汇总低效的SQL语句

    背景 SQL专家云像"摄像头"一样,对环境.参数配置.服务器性能指标.活动会话.慢语句.磁盘空间.数据库文件.索引.作业.日志等几十个运行指标进行不同频率的实时采集,保存到SQL专 ...