Go网络编程-HTTP程序设计_2

HTTP程序设计

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

简单的HTTP服务器

函数:

 // http.ListenAndServefunc ListenAndServe(addr string, handler Handler) error

用于启动HTTP服务器,监听addr,并使用handler来处理请求。返回启动错误。其中:

  • addr,TCP address,形式为 IP:port,IP省略表示监听全部网络接口

  • handler,经常的被设置为nil,表示使用DefaultServeMux(默认服务复用器)来处理请求。

  • DefaultServeMux要使用以下两个函数来添加请求处理器

    • func Handle(pattern string, handler Handler)

    • func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

示例代码:

httpServerSimple.go

 func HttpServerSimple() {// 一:设置不同路由(path)对应不同的处理器// /ping <-> ponghttp.HandleFunc("/ping", handlePing)​// 三:使用http.Handle设置处理器对象infoHandler := InfoHandler{info: "Welcome to Mashibing Go classroom.",}http.Handle("/info", infoHandler)​// 二:启动监听并提供服务addr := ":8088"log.Println("http server is listening on ", addr)err := http.ListenAndServe(addr, nil)log.Fatalln(err)}​// http.ResponseWriter 响应Writer// *http.Request 请求对象,包含了请求信息func handlePing(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "pong")}​// InfoHandler 实现Handler接口的类型type InfoHandler struct {info string}​func (h InfoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, h.info)}

其中:Handler 接口的定义为:

 type Handler interface {ServeHTTP(ResponseWriter, *Request)}

我们的 InfoHandler实现了Handler接口,可以作为 http.Handle()的第二个参数来使用。

测试,通过main.main() 启动服务器:

httpServerSimple.go

 func main() {// 简单的HTTP服务器HttpServerSimple()}

运行

 go run httpServerSimple.go2023/03/02 21:00:29 http server is listening on  :8088

请求测试:

 curl http://localhost:8088/pingpong​curl http://localhost:8088/infoWelcome to Mashibing Go classroom.

复杂的HTTP服务器

定制性的HTTP服务器,通过 Server 类型进行设置。其定义如下:

 // net/httptype Server struct {// TCP AddressAddr stringHandler Handler // handler to invoke, http.DefaultServeMux if nil// LSConfig optionally provides a TLS configuration for use// by ServeTLS and ListenAndServeTLSTLSConfig *tls.Config// 读请求超时时间ReadTimeout time.Duration// 读请求头超时时间ReadHeaderTimeout time.Duration// 写响应超时时间WriteTimeout time.Duration// 空闲超时时间IdleTimeout time.Duration// Header最大长度MaxHeaderBytes int​// 其他字段略}

该类型的 func (srv *Server) ListenAndServe() error 函数用于监听和服务。

示例代码:

 // @file: HttpServerCustom.go​func HttpServerCustom() {myHandler := CustomHandler{message: "http.Server"}s := &http.Server{Addr:           ":8080",Handler:        myHandler,ReadTimeout:    10 * time.Second,WriteTimeout:   10 * time.Second,MaxHeaderBytes: 1 << 20,}log.Fatal(s.ListenAndServe())}​type CustomHandler struct {message string}​func (h CustomHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {time.Sleep(10 * time.Second)fmt.Fprintf(w, h.message)}

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

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

相关文章

React Router 6笔记

一个路由就是一个映射关系 key为路径&#xff0c;value可能是function或component 路由分类 后端路由&#xff08;node&#xff09; value是function&#xff0c;用来处理客户端提交的请求注册路由&#xff1a;router.get(path, function(req, res))工作过程&#xff1a;当…

Java并发04之线程同步机制

文章目录 1 线程安全1.1 线程安全的变量1.2 Spring Bean1.3 如果保证线程安全 2 synchronized关键字2.1 Java对象头2.1.1 对象组成部分2.1.2 锁类型2.1.3 锁对象 2.2 synchronized底层实现2.2.1 无锁状态2.2.2 偏向锁状态2.2.3 轻量级锁状态2.2.4 重量级锁2.2.5 锁类型总结2.2.…

C++11 容器emplace方法刨析

如果是直接插入对象 push_back()和emplace_back()没有区别但如果直接传入构造函数所需参数&#xff0c;emplace_back()会直接在容器底层构造对象&#xff0c;省去了调用拷贝构造或者移动构造的过程 class Test { public:Test(int a){cout<<"Test(int)"<<…

链表(4) ----跳表

跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;用于替代平衡树&#xff08;如 AVL 树或红黑树&#xff09;。它是基于多层链表的&#xff0c;每一层都是上一层的子集。跳表可以提供与平衡树相似的搜索性能&#xff0c;即在最坏情况下&#xff0c;搜…

zlgcan,周立功Can设备,Qt中间件,QtCanBus插件,即插即用

新增zlgcan插件&#xff0c;需要请看下方视频回复联系&#xff01; 视频链接地址&#xff1a; Qt,canbus manager,周立功,zlgcan插件演示,需要请留言_哔哩哔哩_bilibili

反爬虫策略中的IP地址轮换如何实现?挑战与对策

当今互联网时代&#xff0c;各类网站、网络平台背后隐藏着大量数据&#xff0c;广告数据收集、市场数据收集都需要依托爬虫技术&#xff0c;但很多网站通过反爬虫技术限制或屏蔽爬虫的访问&#xff0c;这给数据收集带来不小的挑战。 为了规避这些反爬虫策略&#xff0c;开发人…

JVM--内存分配与回收策略

1.前言 对象的内存分配&#xff0c;从概念上讲&#xff0c;应该都是在堆上分配&#xff08;而实际上也有可能经过即时编译后被拆散 为标量类型并间接地在栈上分配 &#xff09;。在经典分代的设计下&#xff0c;新生对象通常会分配在新生代中&#xff0c;少数 情况下&#xff0…

计数,桶与基数排序

目录 一. 计数排序 概念 步骤思路如下 实现代码如下 时间复杂度与空间复杂度 1. 时间复杂度 2. 空间复杂度 计数排序的特点 二. 桶排序 概念 步骤思路如下 实现代码如下 时间复杂度与空间复杂度 1. 时间复杂度 2. 空间复杂度 桶排序的特点 三. 基数排序 概念 步…

Java核心API——Collection类

Collection类简介 * java集合框架 * java.util.Collection接口&#xff0c;是所有集合的顶级接口&#xff0c;规定了集合所必须的功能 * <p> * 集合与数组一样&#xff0c;可以保存一组具有相同类型元素数据结构 * 并且提供了对于元素的维护操作(方法)。 * 集合有多种不…

千万罚单,稠州商业银行屡教不改?

撰稿|芋圆 来源|贝多财经 今年&#xff0c;浙江稠州商业银行&#xff08;以下简称“稠州商行”&#xff09;似乎进入了多事之秋&#xff0c;刚刚兼并两家经营不善的村镇银行就紧接着收到大额罚单。 该行在2023年的经营业绩不算难看。据2023年年报&#xff0c;稠州商行的业绩从…

PHP 调用 1688 详情 API 接口的实战攻略

在电商领域&#xff0c;获取准确和详细的商品信息对于业务的发展至关重要。1688 作为国内知名的批发采购平台&#xff0c;其详情 API 接口为开发者提供了丰富的数据资源。本文将为您详细介绍如何使用 PHP 调用 1688 详情 API 接口。 一、前期准备 注册 1688 开放平台账号&#…

L2TP(Client-initiated模式)over IPSEC远程拨号实验

一、实验目的及拓扑 实验目的&#xff1a;通过L2TP客户端与LNS服务端建立L2TP隧道并承载在IPSEC网络上。其中L2TPoverIPsec客户端采用windows软终端模式&#xff08;Cloud3&#xff09;&#xff0c;AR1上将内网LNS&#xff08;FW1&#xff09;服务器采用NAT方式向外网进行映射…

基于深度学习的水果识别系统

1. 引言 随着计算机视觉技术的快速发展&#xff0c;基于深度学习的水果识别系统在农业、超市等场景中具有广泛的应用前景。例如&#xff0c;在农业中&#xff0c;水果识别系统可以帮助农民自动分类和计数水果&#xff0c;从而提高效率并减少人工成本&#xff1b;在超市中&…

【机器学习】使用Python的dlib库实现人脸识别技术

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、传统人脸识别技术1. 基于几何特征的方法2. 基于模板匹配的方法3. 基于统计学习的方法 三、深度学习在脸识别中的应用1. 卷积神经网络&#xff08;CNN&#xff09;2. FaceNet和ArcFace 四、使用Python和dlib库实…

Spring1(开发工具安装及配置 初始Spring 解耦实现 SpringIOC SpringDI Spring常见面试题)

目录 一 、开发工具安装及配置 IDEA简介 安装 配置 常⽤快捷键 部署maven 1.配置环境​编辑 2.创建一个maven项目​编辑 选择maven​编辑​编辑 二、初始Spring Spring历史由来 Spring体系结构 Spring生态系统 三、解耦实现 jdbc 三层思想​编辑 四…

leetcode_26. 删除有序数组中的重复项

leetcode_26. 删除有序数组中的重复项 leetcode链接 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums…

可视化剪辑,账号矩阵,视频分发,聚合私信一体化营销工具 源----代码开发部署方案

可视化剪辑&#xff1a; 为了实现可视化剪辑功能&#xff0c;可以使用流行的视频编辑软件或者开发自己的视频编辑工具。其中&#xff0c;通过设计用户友好的界面&#xff0c;用户可以简单地拖拽和放大缩小视频片段&#xff0c;剪辑出满足需求的视频。在开发过程中&#xff0c;可…

SQL进阶

目录 SQL索引 SQL索引 索引 作用帮助数据库管理系统高效获取数据的数据结构 数据处理分类 OLTP&#xff08;联机事务处理&#xff09;OLAP&#xff08;联机分析处理&#xff09;一般用于处理客户的事务和进行查询一般用于市场的数据分析&#xff08;数据量通常很大&#xff0…

JDK版本详解

Oracle JDK 和 OpenJDK 的对比 Oracle JDK版本将每三年发布一次&#xff0c;而OpenJDK版本每三个月发布一次&#xff1b;OpenJDK 是一个参考模型并且是完全开源的&#xff0c;而Oracle JDK是OpenJDK的一个实现&#xff0c;并不是完全开源的&#xff1b;Oracle JDK 比 OpenJDK …

多源字段聚合重塑算法

要求如下 [[{"oone": "评估是否聘请第三方机构","otwo": null,"othree": "test",},{"oone": "评估是否聘请第三方机构","otwo": null,"othree": "test",}],[{"oon…