Go语言的创建HTTP服务器

使用Go自己动手搭建一个HTTP代理服务器 代理服务器的工作方式如下: 客户端向代理服务器发送请求,表明自己需要请求的网站内容 代理服务器接收到来自客户端的请求之后,通过解析,获取到需要访问的web服务 代理服务器将客户端的请求信息全部转发给web服务器 web服务器返回响应消息给代理服务器 代理服务器将返回的消息转发给对应的客户端 下面介绍一下如何使用golang搭建一个简单的HTTP代理服务器(不支持HTTPS) 1. 首先,我们需要绑定一个端口监听客户端的请求,如果客户端发送请求,便进行相关处理 func main() { // 端口 阅读详情

通过hello World Web服务器宣告你的存在

标准库存中的net/http包提供了多种创建HTTP服务器的方法,它还提供了一个基本路由器。

使用Go语言编写的基础HTTP服务器,程序清单如下:

package main

import (
	"net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World\n"))
}

func main() {
	http.HandleFunc("/", helloWorld)
	http.ListenAndServe(":8000", nil)
}

运行结果,命令行内容一直没出来,在“http://localhost:8000/”网页上出现一句话:“Hello World”。

使用方法HandleFunc创建路由。这个方法接受一个模式和一个函数,其中前者描述了路径,而后者指定如何对发送到该路径的请求做出响应。

为响应客户端,使用方法ListenAndServe来启动一个服务器,这个服务器监听localhost和端口8000.

查看请求和响应

curl是一款用于发起HTTP请求的命令行工具。需要安装curl.

输入命令行如下:

curl --version

代码如下:

curl 7.77.0 (x86_64-apple-darwin21.0) libcurl/7.77.0 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.42.0
Release-Date: 2021-05-26
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets

使用curl发出请求

安装curl后,就可在开发和调试Web服务器时使用它。不使用Web浏览器,而使用curl来向Web服务器发送各种请求以及查看响应。

打开终端并运行这个服务器,代码如下:

go run main.go

再打开另一个终端,执行下面的命令,其中的选项-is指定打印报头。如下:

curl -is http://localhost:8000

运行结果如下:

HTTP/1.1 200 OK
Date: Mon, 31 Jan 2022 14:10:10 GMT
Content-Length: 12
Content-Type: text/plain; charset=utf-8

Hello World

这个响应使用的协议为HTTP 1.1,状态码为200 。

报头Date详细地描述了响应的发送时间。

报头Content-Length详细地指出了响应的长度,这里是12字节。

报头Content-Type指出了内容的类型以及使用的编码。在这里,响应的内容类型为text/plain,是使用utf-8进行编码的。

最后输出的是响应体,这里是Hello World。

详谈路由:

HandleFunc用于注册对URL地址映射进行响应的函数。简单地说着,HandleFunc创建一个路由表,让HTTP服务器能够正确地做出响应。

http.HandleFunc("/",helloworld)
http.HandleFunc("/users/",usersHandler)
http.HandleFunc("/projects/",projectsHandler)

每当用户向/发出请求时,都将调用函数helloWorld,每当用户向/users/发出请求时,都将调用函数sersHandler,依此类推。

使用处理程序函数

处理404错误

默认路由器的行为是将所有没有指定处理程序的请求都定向到/。回到第一个示例,如果用户请求的页面不存在,将调用给/指定的处理程序,从而返回响应Hello World和状态码200 。

代码如下:

package main

import (
	"net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	w.Write([]byte("Hello World\n"))
}

func main() {
	http.HandleFunc("/", helloWorld)
	http.ListenAndServe(":8000", nil)
}

使用go run命令行时,输入另外一个命令行如下:

curl -is http://localhost:8000/asdfa

运行结果如下:

HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Fri, 04 Feb 2022 07:25:38 GMT
Content-Length: 19

404 page not found

设置报头

处理程序函数可使用ResponseWriter来添加报头。如下所示:

w.Header().Set("Content-Type", "application/json; charset=utf-8")

在响应中添加报头,代码如下:

package main

import (
	"net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.Write([]byte(`{"hello": "world"}`))
}

func main() {
	http.HandleFunc("/", helloWorld)
	http.ListenAndServe(":8000", nil)
}

使用go run命令行时,输入另外一个命令行如下:

curl -is http://localhost:8000/

运行结果如下:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Fri, 04 Feb 2022 07:33:24 GMT
Content-Length: 18

{"hello": "world"}

响应以不同类型的内容

以不同类型的内容进行响应,代码如下:

package main

import (
	"net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	switch r.Header.Get("Accept") {
	case "application/json":
		w.Header().Set("Content-Type", "application/json; charset=utf-8")
		w.Write([]byte(`{"message": "Hello World"}`))
	case "application/xml":
		w.Header().Set("Content-Type", "application/xml; charset=utf-8")
		w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?><Message>Hello World</Message>`))
	default:
		w.Header().Set("Content-Type", "application/json; charset=utf-8")
		w.Write([]byte("Hello World\n"))
	}

}

func main() {
	http.HandleFunc("/", helloWorld)
	http.ListenAndServe(":8000", nil)
}

使用go run命令行时,输入另外一个命令行如下:

curl -si -H 'Accept: application/json' http://localhost:8000

运行结果如下:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Fri, 04 Feb 2022 08:31:23 GMT
Content-Length: 26

{"message": "Hello World"}

 使用go run命令行时,输入另外一个命令行如下:

curl -si -H 'Accept: application/xml' http://localhost:8000

命令行的运行结果如下:

HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Date: Fri, 04 Feb 2022 08:30:36 GMT
Content-Length: 68

<?xml version="1.0" encoding="utf-8"?><Message>Hello World</Message>

响应不同类型的请求

代码如下:

package main

import (
	"net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	switch r.Method {
	case "GET":
		w.Write([]byte("Received a GET request\n"))
	case "POST":
		w.Write([]byte("Received a POST request\n"))
	default:
		w.WriteHeader(http.StatusNotImplemented)
		w.Write([]byte(http.StatusText(http.StatusNotImplemented)) + "\n")
	}

}

func main() {
	http.HandleFunc("/", helloWorld)
	http.ListenAndServe(":8000", nil)
}

代码错误如下: 

# command-line-arguments
./main.go:19:62: invalid operation: ([]byte)(http.StatusText(http.StatusNotImplemented)) + "\n" (mismatched types []byte and untyped string)

只能删除"\n",这个,才能运行成功。 

使用go run命令行时,输入另外一个命令行如下:

curl -si -X GET http://localhost:8000

命令行的运行结果如下:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2022 09:01:49 GMT
Content-Length: 23
Content-Type: text/plain; charset=utf-8

Received a GET request

 使用go run命令行时,输入另外一个命令行如下:

curl -si -X POST http://localhost:8000

命令行的运行结果如下:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2022 09:02:16 GMT
Content-Length: 24
Content-Type: text/plain; charset=utf-8

Received a POST request

获取GET和POST请求中的数据

处理不同请求中的数据,代码如下:

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func helloWorld(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	switch r.Method {
	case "GET":
		for k, v := range r.URL.Query() {
			fmt.Printf("%s:  %s\n", k, v)
		}
		w.Write([]byte("Received a GET request\n"))
	case "POST":
		reqBody, err := ioutil.ReadAll(r.Body)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%s\n", reqBody)
		w.Write([]byte("Received a POST request\n"))
	default:
		w.WriteHeader(http.StatusNotImplemented)
		w.Write([]byte(http.StatusText(http.StatusNotImplemented)))
	}

}

func main() {
	http.HandleFunc("/", helloWorld)
	http.ListenAndServe(":8000", nil)
}

使用go run命令行时,输入另外一个命令行如下:

curl -si "http://localhost:8000/?foo=1&bar=2"

命令行的运行结果如下:使用curl向这个Web服务器发出包含一些查询参数的GET请求。

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2022 08:55:50 GMT
Content-Length: 23
Content-Type: text/plain; charset=utf-8

Received a GET request

代码的运行结果如下:

bar:  [2]
foo:  [1]

使用go run命令行时,输入另外一个命令行如下:

curl -si POST -d "some data to send" http://localhost:8000/

命令行的运行结果如下:使用curl向这个Web服务器发出POST请求。

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2022 08:59:10 GMT
Content-Length: 24
Content-Type: text/plain; charset=utf-8

Received a POST request

代码的运行结果如下:

some data to send

Go语言基础入门(创建简单HTTP服务器) 标准库中的net/http包提供了多种创建HTTP服务器的方法,它还提供了一个基本路由器。 package main import "net/http" func helloWorld(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World\n")) //[]byte声明一个字节切片并将字符串转换为字节。 } func main() { //使用方法HandFunc创建路由/,这个方法接受一个模式和一个 阅读详情

相关推荐

Go语言创建HTTP服务器

介绍在Go语言中如何创建HTTP服务器

禅与代码的艺术 1167

Golang HTTP 服务器

用 Go实现一个 http server 非常容易,Go 语言标准库 net/http 自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。

Sakura的博客 2641

使用Golang构建HTTP服务器

Golang是一种强大的编程语言,具有高效和并发处理的特点,非常适合用于构建Web应用程序和HTTP服务器。在本文中,我将向您展示如何使用Golang构建一个简单的HTTP服务器。如果一切顺利,您应该在终端中看到"Server started on port 8080"的消息。希望这篇文章对您有帮助,让您了解如何使用Golang构建一个简单的HTTP服务器。您还可以使用其他Golang的功能和包来构建更复杂的HTTP服务器。接下来,我们将创建一个新的Go模块并初始化一个HTTP服务器项目。

ZwqDatabase的博客 369

【Go实战基础】用 Go 如何实现一个 HTTP 服务

一、简介 HTTP API 服务是 Go 中最常用的功能之一,可以用最简单的几行代码写出一个性能强大的 HTTP 服务,这就是 Go 的魅力。 用 Go实现一个 http server 非常容易,Go 语言标准库 net/http 自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。 二、数据结构 基于HTTP构建的服务标准模型包括两个端,客户端(Client)和服务端(Server)。HTTP 请求从

菜鸟实战的博客 3327

以下是一个简单的Go语言程序,它使用了net/http标准库来创建一个简单的HTTP服务器,并在浏览器中显示“Hello, World!“。

将代码保存为`.go`文件,例如`hello.go`,然后在命令行中运行`go run hello.go`。5. 使用`http.ListenAndServe`启动服务器,它接受两个参数:一个是服务器监听的地址和端口,另一个是处理所有HTTP请求的处理器。当然,下面是一个使用Go语言的`net/http`标准库创建的简单HTTP服务器的示例代码,它会在浏览器中显示"Hello, World!1. 导入必要的包:`fmt`用于格式化输出,`log`用于日志记录,`net/http`用于HTTP服务。

靡不有初,鲜克有终 542

OpencvSharp学习笔记(一):图片的打开,保存灰度化,保存

近来萌生了学习OpenCv的想法,经过度娘得知老夫会的C#不能直接用OpenCv,只能用他的儿子OpenCvSharp与EmguCV,奈何奈何,这两玩意的资料少的出奇,只能慢慢的摸索了,EmguCV先不说,老夫找到了牛批的资料,先摸索OpencvSharp吧 首先打开VS通过Nuget安装 选择版本后点击安装就OK了. 安装完成后,引用里面就有以下的玩意儿了… 废话不多说了,在写程序前先 using OpenCvSharp 图片打开,灰度化,保存代码如下: static void Main(strin

猥琐de专注 7186

用GO语言创建一个基本的HTTP服务器

并实现一些基本的功能,如响应GET请求和POST请求。

2401_85194651的博客 1323

双足步行机器人的ZMP与CoP检测

静态步行与动态步行   机器人步态分为静态步行和动态步行。当机器人做静态步行运动时,身体的各个部分运动速度很小,机器人的整体稳定性较易控制。静态步行稳定性采用机器人的重心地面投影点(Center of Gravity,简称CoG)作为稳定性标准,这种判定方法适用于运动较为缓慢的情况。如果机器人采用的是一种高速运动的步行方式,则称之为动态步行。当机器人进行动态步行时,其重心的位置和加速度的大小时...

weixin_34112208的博客 5907

go语言服务器连接编程,Go语言使用HTTP包创建WEB服务器的方法

本文实例讲述了Go语言使用HTTP包创建WEB服务器的方法。分享给大家供大家参考,具体如下:在Golang中写一个http web服务器大致是有两种方法:1 使用net包的net.Listen来对端口进行监听2 使用net/http包这里是讨论如何使用net/http包创建一个web服务器net/http请求提供了HTTP客户端和服务端的具体实现http客户端先看到的是Get,Post,PostF...

weixin_29785723的博客 352

Vercel部署个人博客

先去注册一个账号,建议注册一个Github账号后,使用Github账号来登录Vercel。vercel 部署静态资源网站极其方便简单,并且有可观的访问速度,最主要的是免费部署。此时项目已经成功搭建完毕了,点击图片即可跳转到 vercel 所提供的二级域名访问。然后可以直接拉取我的仓库,所有已经配置好了,可以直接使用,建议fork成自己的!然后修改dns就行,注意vercel提供的域名可能访问不了,需要自己绑定!如果有自己的域名,还可以在 vercel 中进行设置。进入Vercel官网。

醉里博客202271.xyz 2358

静态时序分析Static Timing Analysis1——STA概述、标准工艺库、时钟、IO约束的建立

简要介绍STA和标准工艺库内容,对时钟,IO等进行约束的指令介绍,PVT

qq_42135020的博客 7537

使用Go语言创建HTTP服务器并展示网页

Go语言的"net/http"包为HTTP通信提供了强大的支持,包括请求和响应的解析、HTTPS处理、URL路由等。这使得开发者可以专注于实现业务逻辑,而无需从零开始构建基础功能。此外,Go语言的标准库还提供了丰富的其他功能,如加密、数据库访问等,进一步简化了HTTP服务器的开发过程。

m0_73500130的博客 1141

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2024】_再现性;深度学习

coderVAEVAEVAE) (Kingma威林,2014)在概率性的工作方式学习观测数据之间的映射空间x∈Rmx∈R^mx∈Rm 和潜在的空间z∈Rnmnz∈Rn(m>>n)。作为一个潜变量模型,VAEVAEVAE制定这个问题作为观察样品的最大化对数似logpxlog∫px∣zpzdzpx∣zp (x | z)p(x∣z)可以很容易地使用神经网络建模,和pzp (z)

2401_84181704的博客 1242

使用go语言创建一个http服务器.

使用go语言创建一个http服务器. package main import ( "fmt" "log" "net/http" ) func myFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "hello world!") } func main() { http.HandleFunc("/hello", myFunc) log.Fatal(http.ListenAndServe(":8080", nil))

crontab_e的博客 126

立创电赛C题:基于STM32的三端口DC-DC变换器设计与MPPT算法实现

本文详细解析了2021年立创电赛C题——基于STM32的三端口DC-DC变换器设计。文章从题目要求出发,系统阐述了采用双DC-DC电路(分别负责MPPT追踪与稳压)的硬件架构,并重点讲解了以STM32为核心、结合PID控制与扰动观察法(MPPT算法)的软件实现方案,为备赛者提供了完整的软硬件设计思路与调试经验。

weixin_42588877的博客 224

【人工智能】提示词工程:让大模型精准响应的核心技术,提示词的基础框架 以及 常见提示词框架及场景

编写提示词的基础原则包括:简单、明确、详细,提示词拥有零样本提示、少样本提示、分配角色、提示写作风格、限定输出格式等技巧。

奶爸的编程之路,也就一周冷个三天 1138

go语言创建http服务器

概念: ServeMux是一个HTTP请求路由器(或多路复用器,Multiplexor)。它将每个传入的请求的URL与已注册的pattern列表相匹配,并调用与URL最接近的pattern对应的Handler。 Handler,处理器,负责输出HTTP响应的头和正文。任何满足了http.Handler接口的对象都可作为一个处理器。Handler接口只需实现一个方法:ServeHTTP(http....

weixin_43156609的博客 787

前后端面试题【目录】

工作时候扭螺丝,面试时候造火箭,现状就是如此。不管是背八股文,还是掌握了知识的精华,对答如流才是硬道理。本专栏就是要集具前端精华,规范、算法、架构、封装、原理等一并汇集,让前端的小伙伴有个思路。, 欢迎一起交流,并非常期望您能够提供有价值的学习资料。

大剑师兰特的GIS世界 1836

Go语言基础入门(创建简单HTTP服务器2)

package main import ( "fmt" "net/http" ) //创建处理器函数 func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello", r.URL.Path) } func main() { //HandlerFunc是一个适配器,通过类型转换让我们可以将普通的函数作为HTTP处理器使用 //如果f是一个具有适当签名的函数,HandlerFunc通过调用实现了H.

Merkle的博客 355

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Go语言实战:创建一个简单的 HTTP 服务器

本文是《Go语言100个实战案例》系列之《网络与并发篇》的第一篇。我们将从零开始,用Go语言构建一个基础的 HTTP 服务器,掌握 Go 在服务端开发中的关键能力。

tenkofx的博客 986

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Go语言从入门到精通 -【web项目实战篇】- 搭建Web服务器

本节核心内容 介绍使用net/http包创建HTTP服务 介绍使用net/http包建立Web服务器 介绍Gin框架 本小节视频教程和代码:百度网盘;密码6ejd 可先下载视频和源码到本地,边看视频边结合源码理解后续内容,边学边练。 想查看Gin源码的朋友可自行查看Gin框架官方地址 搭建一个简单的Web服务器 Go语言标准库 - net/http 这里给大家提供一个学习Go语言的一个...

Survivalist_Boy的博客 684

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

golang net/http 包简介

Kubernetes的Api Server中用到了golang的http包,故而做下简单的了解。 package main import ( "fmt" "io" "net/http" ) func main() { http.HandleFunc("/", helloworld) err := http.ListenAndServe(":9090", nil) if err !=...

韦远科的专栏 1038

golang http 返回html文件_Go 中基于 IP 地址的 HTTP 限流

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习Go语言如果你想限制一个正在运行的 HTTP 服务的请求量,你可以使用现有的轮子工具,比如说 https://github.com/didip/tollbooth,但是如果写一些简单的东西,你自己去实现也没有那么难。我们可以用这个包 x/time/rate 。在这篇教程中,我们将基于用户的 IP 地址构造一个简单的限流中...

weixin_32018379的博客 483

Go net/http包

使用net/http包快速创建一个HTTP服务器。// file http_test1.go package main import ( "fmt" "net/http" "log" )func HandleIndex(w http.ResponseWriter, r *http.Request) { r.ParseForm() fmt.Println("PA

Muge 1582

呜呜呜我要拿Go赢他~ 入门,Go的最简单的 Web 服务器!

golang 支持多返回值,这是一个很大的不同点golang 方法的作用域和变量作用域一样,通过大小写控制golang 的返回值是可以有名字的,可以通过给予名字让调用方清楚知道你返回的是什么本期结束咱们下次再见👋~🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

杨不易呀 269

【亲测免费】 MCP-golang 开源项目教程

MCP-golang 是一个非官方的 Model Context Protocol(MCP)在 Go 语言中的实现。它允许开发者使用几行代码就可以编写 MCP 服务器和客户端。MCP-golang 旨在提供类型安全、自定义传输、低模板代码、模块化以及双向通信的支持。 ## 2. 项目快速启动 以下是快速启动 MCP-golang 项目的步骤: 首先,确保你已经安装了 Go 环境。 ```b...

gitblog_00448的博客 1160
上一篇: 学习如何把代码上传到github(不行,不会做)
下一篇: Go语言的创建HTTP客户端
DXB2021
博客等级 码龄5年 307粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值