Golang笔记:使用http包实现基础WebServer功能

news2024/12/23 13:45:56

文章目录

  • 目的
  • 监听请求并响应
  • 请求解析
  • 进行响应
  • 静态文件服务
  • 总结

目的

WebServer是一种非常常用的功能,Golang的高并发特性在处理此类工作中也有较大的优势,同时借助标准库中的 net/http 包可以非常快速的编写WebServer应用。这篇文章将简单记录下相关内容。

https://pkg.go.dev/net/http

Package http provides HTTP client and server implementations.

监听请求并响应

WebServer本质上来说很简单,主要可以为两步:

  • 监听某个端口号上收到的HTTP数据;
  • 根据收到的HTTP请求中的路径执行对应的操作;

下面是个简单的示例:

package main

import (
	"fmt"
	"log"
	"net/http"
	"time"
)

func hello(w http.ResponseWriter, r *http.Request) { //回调函数,回调函数将在协程中运行
	time.Sleep(4 * time.Second)
	fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path) // 向客户端应答数据
}

func naisu(w http.ResponseWriter, r *http.Request) { //回调函数
	fmt.Fprintln(w, "Naisu 233!") // 向客户端应答数据
}

func main() {
	http.HandleFunc("/", hello)      // 设置路由地址与对应回调函数
	http.HandleFunc("/naisu", naisu) // 实际应用中通常根据需求设置多个路由地址与对应回调函数

	err := http.ListenAndServe(":80", nil) // 启动WebServer,监听80端口,可以在本机浏览器中通过 http://localhost:<端口号><路由地址> 进行访问(80端口可以省略:80)
	// err := http.ListenAndServe("0.0.0.0:80", nil) // 在本机所有网卡上进行监听,同网段下的设备可以通过 http://本机IP地址/ 进行访问
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

在这里插入图片描述

上面示例中核心涉及的就两个方法:

  • func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
    该方法用于设置路由和对应的回调函数;
  • func ListenAndServe(addr string, handler Handler) error
    该方法用于监听某个端口号,启动WebServer;
    该方法还有个变种 ListenAndServeTLS 用于启动HTTPS服务;

请求解析

上面的回调函数原型是 func(http.ResponseWriter, *http.Request) 包含了请求对象和返回的响应对象,实际操作中也主要就是根据请求的内容和业务逻辑进行响应。

下面例子中打印了请求对象中的一些内容:

package main

import (
	"fmt"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Println(r.Method)
	fmt.Println(r.URL)
	fmt.Println(r.Header) // 请求头,各个请求头字段以字典形式保存
	fmt.Println(r.Body)
	fmt.Println(r.ContentLength)
}

func main() {
	http.HandleFunc("/", hello)

	http.ListenAndServe(":80", nil)
}

在这里插入图片描述
上面演示中 /favicon.ico 是浏览器自己发起的请求。

更多使用方法可以查看官方文档中 Request 类型和相关的方法。

进行响应

进行响应主要就是设置响应头字段,设置状态码,写正文内容这些。

package main

import (
	"io"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Trailer", "AtEnd1, AtEnd2")                 // 设置(添加)响应头字段
	w.Header().Add("Trailer", "AtEnd3")                         // 添加响应头字段
	w.Header().Set("Content-Type", "text/plain; charset=utf-8") // 添加响应头字段
	w.WriteHeader(http.StatusOK)                                // 写状态码
	io.WriteString(w, "Hello Naisu.\n")                         // 响应body内容
	// 注意写头字段、状态码和body的顺序
}

func main() {
	http.HandleFunc("/", hello)

	http.ListenAndServe(":80", nil)
}

在这里插入图片描述

更多使用方法可以查看官方文档中 ResponseWriter 类型和相关的方法。

静态文件服务

对于WebServer来说静态文件服务是非常常用的功能。静态文件服务最常用的就是提供前端网页文件等,所以我们这里弦准备一个名为 index.html 文件,放在当前项目目录下,文件内容如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1 style="color: #4DD498;">Hello Naisu!</h1>
</body>
</html>

然后使用下面方式启动静态文件服务:

package main

import (
	"net/http"
)

func main() {
	fs := http.FileServer(http.Dir("./"))       // 设置静态文件存放路径,可以使用绝对或相对路径
	http.Handle("/", http.StripPrefix("/", fs)) // 设置静态文件路由处理,通过 http://localhost/文件名 进行访问
	// http.Handle("/static/", http.StripPrefix("/static/", fs)) // 通过 http://localhost/static/文件名 进行访问
	// 设置静态文件存放路径根目录下的 index.html 文件可以不加文件名进行访问

	http.ListenAndServe(":80", nil)
}

在这里插入图片描述

静态文件服务除了上面这样简单使用外,也可以进行定制,比如官方文档中的例子,过滤了设置的目录下所有文件名以 . 开头的文件:
https://pkg.go.dev/net/http#example-FileServer-DotFileHiding

总结

Golang使用标准库中的 net/http 来编写WebServer是比较简单的。更多教程可以参考下面链接:
https://gowebexamples.com/
https://github.com/astaxie/build-web-application-with-golang

实际工作中如果需求比较全面的话全部细节功能都从头实现的话就比较麻烦了。Golang有一个非常出名的用于Web开发的工具库Gorilla,实现了很多常用的功能:
https://www.gorillatoolkit.org/

对于更加复杂的项目也可以直接使用现成的框架。Gin是一个Golang的主流的轻量级Web框架,其官网和项目地址如下:
https://gin-gonic.com/
https://github.com/gin-gonic/gin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商业智能上阵,城商行突围数字经济时代

作者 | 曾响铃 文 | 响铃说 ChatGPT爆火&#xff0c;究竟带来了什么&#xff1f; 有人说&#xff0c;它以一种面向C端的直观方式&#xff0c;让普罗大众第一次直观感受到“智能化”的能力和价值。 只要大胆“提出要求”&#xff0c;一个智能化的应用就能够“给出回应”&…

《从0开始学架构》课程笔记(一)

架构到底是指什么&#xff1f; 架构设计相关的特性&#xff1a; 架构设计的思维和程序设计的思维差异很大&#xff0c;架构设计的关键思维是判断和取舍&#xff0c;程序设计的关键思维是逻辑和实现。架构设计没有体系化的培训和训练机制。程序员对架构设计的理解存在很多误区。…

公网SSH远程连接Android Termux - 电脑使用安卓Termux【cpolar内网穿透】

文章目录 1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不过我们可以开启ssh&#xff0c;使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在安卓手机te…

Kali-linux渗透攻击应用

前面依次介绍了Armitage、MSFCONSOLE和MSFCLI接口的概念及使用。本节将介绍使用MSFCONSOLE工具渗透攻击MySQL数据库服务、PostgreSQL数据库服务、Tomcat服务和PDF文件等。 6.4.1 渗透攻击MySQL数据库服务 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发…

【Sa-Token】Demo OAuth2 授权码模式(静默授权)调用流程分析

文章目录 前言参考目录测试 Demo调用流程分析调用流程说明源码分析0、启动项目1、步骤1&#xff1a;点击授权登录1.1、获取变量以及配置&#xff08;路由分发的实现&#xff09;1.2、获取客户端对象1.3、尝试授权&#xff08;未登录&#xff09;2、步骤2&#xff1a;输入账号密…

深度探索存储与检索

一个数据库在最基础的层次上需要完成两件事情&#xff1a;当你把数据交给数据库时&#xff0c;它应当把数据存储起来&#xff1b;而后当你向数据库要数据时&#xff0c;它应当把数据返回给你。 作为程序员&#xff0c;为什么要关心数据库内部存储与检索的机理&#xff1f;你可…

生物识别技术是否可以成为应对安全挑战的最佳选择?

引言 随着科技的快速发展&#xff0c;人们对于个人信息安全和物质财富保护的需求越来越高。同时&#xff0c;在恐怖主义和犯罪活动日益增多的当下&#xff0c;各国政府也在积极探索新的安全保障手段。生物识别技术应运而生&#xff0c;其能够通过人体生理特征或行为模式进行身份…

Dynamics 365 自动化发布工具Spkl介绍

本篇主要是为了后面讲述CI/CD时用到的工具做一个说明&#xff0c;先奉上spkl的github地址&#xff0c;没听说过的可以去查看下&#xff0c;挺不错的工具。 我们主要用这个工具来部署WebResource, Plugin和Workflow Activities 以及后续的CI 首先从nuget上下载工具包&#xff0c…

SpringMVC访问JSP页面

1. 在spring-web中配置视图解析器 <!--3&#xff1a;配置JSP 显示ViewResolver--> <bean class"org.springframework.web.servlet.view.InternalResourceViewResolver"><property name"viewClass" value"org.springframework.web.ser…

【Python】PIL给图片添加水印最全代码解释

给图片添加水印 以下是一个添加水印的方法&#xff0c;你可以将其放在一个单独的 Python 文件中&#xff0c;然后在需要添加水印的地方调用该方法即可&#xff1a; from PIL import Image, ImageDraw, ImageFontdef add_watermark(image_path, text, font_path, font_size40,…

Redis 经典面试题合合集详解

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Cy7-COOH近红外菁染料CAS号1628790-40-8星戈瑞

CY7-COOH是一种红外荧光染料&#xff0c;其最大激发和发射波长分别为750nm和773nm。这种荧光染料分子具有较高的光稳定性和化学稳定性&#xff0c;可以在细胞和组织中长时间稳定地发光&#xff0c;因此应用于生命科学领域的荧光显微镜成像、生物传感和分析等方面。 产品名称&a…

深眸科技|工业3D视觉创新崛起,与2D视觉融合创建更高效解决方案

近年来&#xff0c;伴随着人工智能技术的进步&#xff0c;行业应用需求的提升&#xff0c;机器视觉技术持续升级。由于2D视觉技术难以满足精密制造行业不断提高的精度需求&#xff0c;能够更全面、更多维了解产品信息的3D视觉技术逐渐火热&#xff0c;并掀起浪潮。 据GGII数据…

西米支付:数字人民币接口来了!实时清算至数字人民币钱包。

1. 产品概述 什么是数字人民币&#xff1f; 是由中国人民银行发行的数字形式的法定货币&#xff0c;由指定运营机构参与运营&#xff0c;与实物人民 币等价&#xff0c;具有价值特征和法偿性&#xff0c;是一种零售型央行数字货币&#xff0c;也是未来主流支付方式之一&#…

楠姐技术漫话:图计算的那些事 | 京东云技术团队

不知道大家在平时的工作中 有没有听说过“图计算”这个名词 但大家一定在各工作汇报&#xff0c;技术分享中听说过“智能化”&#xff0c;“人工智能”这样的字眼 而我们今天要唠的这个图计算 就是人工智能领域内近几年炙手可热的前沿宠儿 也是我们风控反欺诈中常用的“大杀…

不会Elasticsearch标准查询语句,如何分析数仓数据?

1 Elasticsearch的查询语句 ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互&#xff0c;这种方式的丰富查询语法让ES检索变得更强大&#xff0c;更简洁。 1.1 查询预发 # GET /…

ChatGPT中文使用手册

简要介绍&#xff1a; First&#xff1a;什么是ChatGPT? ChatGPT是由OpenAI训练的一款大型语言模型&#xff0c;最新版为GPT3.5&#xff08;公开版&#xff09;和GPT4.0&#xff08;PLUS会员版本&#xff09; 它能够生成类似于人类写作的文本。您只需要给出提示或提出问题&…

ChatGPT实现游戏 NPC 对话

游戏 NPC 对话 玩游戏的一个必要过程&#xff0c;就是和 NPC 对话&#xff0c;领取任务&#xff0c;获取线索。有趣的游戏&#xff0c;会根据用户和 NPC 交流时的不同选择&#xff0c;触发不同剧情走向。甚至多个 NPC 之间还能有罕见的隐藏剧情&#xff0c;等待用户发掘。可以…

《PyTorch高级机器学习实战》包邮送书三本

目录 前言书籍目录抽奖方式 前言 随着人工智能和机器学习的蓬勃发展&#xff0c;相关算法和技术已经广泛运用到诸多行业&#xff0c;大量的研究者和各行业人员也投入机器学习的研究与开发中。 掌握高级机器学习算法原理&#xff0c;并能够根据不同情况实现灵活运用&#xff0…

NineData:高效高质量的Redis可视化管理工具

Redis 是一个内存数据结构存储系统&#xff0c;它被广泛用于缓存、队列、实时分析等多种应用场景中&#xff0c;目前已经成为 Key-value 数据存储系统中的佼佼者&#xff0c;根据 DB-Engine 网站提供的最新数据&#xff0c;Redis 在 Key-value stores 类别中排名第一&#xff0…