【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并发编程实战》清华大学出版社
【go笔记】简单的http服务的更多相关文章
- Netty4.0学习笔记系列之三:构建简单的http服务(转)
http://blog.csdn.net/u013252773/article/details/21254257 本文主要介绍如何通过Netty构建一个简单的http服务. 想要实现的目的是: 1.C ...
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- 《Linux就该这么学》培训笔记_ch11_使用Vsftpd服务传输文件
<Linux就该这么学>培训笔记_ch11_使用Vsftpd服务传输文件 文章最后会post上书本的笔记照片. 文章主要内容: 文件传输协议 Vsftpd服务程序 匿名访问模式 本地用户模 ...
- 《Linux就该这么学》培训笔记_ch17_使用iSCSI服务部署网络存储
<Linux就该这么学>培训笔记_ch17_使用iSCSI服务部署网络存储 文章最后会post上书本的笔记照片. 文章主要内容: iSCSI技术介绍 创建RAID磁盘阵列 配置iSCSI服 ...
- 通过HttpListener实现简单的Http服务
使用HttpListener实现简单的Http服务 HttpListener提供一个简单的.可通过编程方式控制的 HTTP 协议侦听器.使用它可以很容易的提供一些Http服务,而无需启动IIS这类大型 ...
- 树莓派(Raspberry Pi)搭建简单的lamp服务
树莓派(Raspberry Pi)搭建简单的lamp服务: 1. LAMP 的安装 sudo apt-get install apache2 mysql-server mysql-client php ...
- WCF-学习笔记概述之计算服务(1)
关于WCF的介绍,在此不再赘述,其他地方应有尽有.直接开始实例,第一个实例以一个简单的计算服务为例,本人是学习了蒋金楠的<WCF全面解析>. 1.构建解决方案 Interface:用于定义 ...
- 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介
构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...
- linux网络编程学习笔记之三 -----多进程并发服务端
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
- 简单ESB的服务架构
简单ESB的服务架构 这几个月一直在修改架构,所以迟迟没有更新博客. 新的架构是一个基于简单esb的服务架构,主要构成是esb服务注册,wcf服务,MVC项目构成. 首先,我门来看一看解决方案, 1. ...
随机推荐
- PaddlePaddle 飞桨复现 ResNeXt
import paddle.nn as nn import paddle class BN_Conv2D(nn.Layer): """ BN_CONV_RELU &quo ...
- 2021-08-14:给定两个字符串S和T,返回S的所有子序列中有多少个子序列的字面值等于T。
2021-08-14:给定两个字符串S和T,返回S的所有子序列中有多少个子序列的字面值等于T. 福大大 答案2021-08-14: 样本对应模型. 时间复杂度:O(N^2). 空间复杂度:O(N^2) ...
- protoBuf 实现客户端与服务端
转载请注明出处: 1.定义消息格式 在 src/main/proto 目录下创建 person.proto 文件,并定义消息格式,例如: syntax = "proto3"; pa ...
- 500行代码手写docker-以新命名空间运行程序
(2)500行代码手写docker-以新命名空间运行程序 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似do ...
- IntelliJ IDEA上手这一篇就够了,从入门到上瘾
前言 每次换电脑,最最最头疼的事情莫过于安装各种软件和搭建开发环境.这算是不想换电脑的一个原因吧(最主要还是穷).除非是电脑坏了开不了机或者点一下卡一下,真不想换电脑.每次换电脑都得折腾好久. 趁着这 ...
- 深入了解Js中的对象
在JavaScript中,对象是个无序的键值对数据集.例如: var xiaoqiang={ name:"wangqiang", age:30, city:"guangz ...
- Windows常用的 CMD 命令合集
常用的 CMD 命令合集: 基础命令 dir:列出当前目录中的文件和子目录. cd:更改当前目录.例如,cd Documents 将当前目录更改为 Documents 文件夹. md 或 mkdir: ...
- html+css简单易懂的轮播图实现
实现轮播图感觉好复杂啊,这个比较简单的实现了 但是还是没有怎么理解代码,只能先发出来慢慢学习学习了 话不多说,直接上代码 <!DOCTYPE html> <html lang=&qu ...
- 如何在 Memcache 与 Redis 中做选择?
memcache vs redis Memcached和Redis都是流行的内存缓存系统,用于提高应用程序的性能和响应速度.它们有一些相似之处,但也有一些区别.以下是Memcached和Redis之间 ...
- C#/.Net的多播委托到底是啥?彻底剖析下
前言 委托在.Net里面被托管代码封装了之后,看起来似乎有些复杂.但是实际上委托即是函数指针,而多播委托,即是函数指针链.本篇来只涉及底层的逻辑,慎入. 概括 1.示例代码 public delega ...