【GO】go语言中的HTTP标准库 - http编程

上一节已经学习了HTTP的基础知识,本章将学习关于go语言的HTTP编程,最重要的是掌握 net/http  包的用法,以及如何自己编写一个简单的Web服务端,通过客户端访问Server端等。

编写简单的Web 服务器

http.ListenAndServe 启动 Http Server 服务

http.HandleFunc 根据不同的路径将请求路由到不同的处理函数。

路由函数格式固定 ,必须有两个参数 (w http.ResponseWriter,r *http.Request) ,没有返回值

package mainimport ("fmt""net/http"
)func handlerHello(w http.ResponseWriter,r *http.Request)  { // 两个参数 ,将返回参数写入到 w, 请求参数在参数r中,这里是简单的例子,所有没有使用到r参数fmt.Fprintf(w,"Hello World!") // 把返回内容写入 http.ResponseWriter
}func handlerBoy(w http.ResponseWriter,r *http.Request)  {fmt.Fprintf(w,"hello Boy")
}func handlerGirl(w http.ResponseWriter,r *http.Request)  {fmt.Fprintf(w,"hello girl")
}func main()  {// 定义路由,将访问不同目录的请求 路由到 不同的处理函数http.HandleFunc("/",handlerHello) // 路由 ,访问 / 根目录是去执行 handlerHello,上面定义好的函数http.HandleFunc("/boy",handlerBoy) // 路由 ,访问/boy目录是去执行 handlerBoyhttp.HandleFunc("/girl",handlerGirl) // 第一个参数是个字符串 ,第二个参数是个函数// 启动HTTP server 服务,ListenAndServe 如果不发生error会一直阻塞。为每一个请求创建一个协程去处理if err := http.ListenAndServe(":8888",nil); err != nil { // 服务端口为 8888fmt.Printf("start http server fail : %s", err)}}

通过浏览器请求server端

运行之后通过浏览器访问 url http://127.0.0.1:8888/,可以看到返回了 Hello World

http://127.0.0.1:8888/boy

通过浏览器访问 url http://127.0.0.1:8888/boy,返回hello Boy 

可以看到访问不同的路径返回不同的内容,这就是server端路由的左右。

通过Go编写客户端发起请求

可以都通过简单的http.Get 或者 http.Post 发送请求。

也可以通过较为复杂的 http.NewRequest 发送请求,这种方法更为灵活,可以自定义请求头,Cookie等。

另外请求req ,响应resp 中的内容可以拿出来打印或者做响应处理

package mainimport ("fmt""io""net/http""os""strings""time"
)func main()  {get()post()complexHttpRequest()
}// get请求
func get()  {resp, err :=http.Get("http://127.0.0.1:8888/boy")if err != nil {panic(err)}defer resp.Body.Close() // 一定要调用 resp.Body.Close() ,否则会协程泄露io.Copy(os.Stdout,resp.Body)// 打印 响应头for k,v := range resp.Header {fmt.Println(k," = ", v)}fmt.Println(resp.Status) // 响应状态fmt.Println(resp.Proto) // http协议
}// post请求
func post()  {reader:= strings.NewReader("hello server") // 新建一个io.Reader类型resp , err := http.Post("http://127.0.0.1:8888/girl","text/plain",reader) // 第一个参数是URL,第二个参数是 contentType 类型,第三个参数是请求正文,并不是字符串,而是io.Reader类型if err != nil {panic(err)}io.Copy(os.Stdout,resp.Body)defer resp.Body.Close()// 打印resp.Header 响应头for k,v := range resp.Header {fmt.Println(k, "==>", v)}
}// 复杂的请求
func complexHttpRequest() {reader := strings.NewReader("hello server")// 创建请求,该函数接受三个参数 分别为请求方法,请求的url ,bodyreq , err := http.NewRequest("POST","http://127.0.0.1:8888",reader)if err != nil {panic(err)}// 自定义请求头req.Header.Add("User-Agent","中国")req.Header.Add("MyHeaderKey","MyHeaderValue")// 自定义cookiereq.AddCookie(&http.Cookie{Name:"yhh",Value: "yhh_pwd",Path:"/",Domain: "localhost",Expires: time.Now().Add(time.Duration(time.Hour)),})// 构建clientclient := &http.Client{Timeout: 100 * time.Millisecond, // 设置请求的超时时间, 100毫秒 。}// 提交http请求resp, err := client.Do(req)if err != nil {panic(err)}// 一定要记得关闭defer resp.Body.Close()// 打印resp中的内容io.Copy(os.Stdout,resp.Body)// 打印resp header中的内容for k,v := range resp.Header {fmt.Println(k," = ", v)}}

结构体Request 中文注释 

请求中的所有内容基本都在该结构体中,通过学习该结构体加深理解HTTP的基础知识

// Request代表服务器接收到的HTTP请求或客户端要发送的请求。
//
// 字段的语义在客户端和服务器的使用中略有不同。
// 除了下面字段的注释外,还请参阅Request.Write和RoundTripper的文档。
type Request struct {// Method指定HTTP方法(GET、POST、PUT等)。// 对于客户端请求,空字符串表示GET。//// Go的HTTP客户端不支持使用CONNECT方法发送请求。// 有关详情,请参阅Transport的文档。Method string// URL指定正在请求的URI(对于服务器请求)或要访问的URL(对于客户端请求)。//// 对于服务器请求,URL从Request-Line中提供的URI中解析。// 对于大多数请求,除了Path和RawQuery之外的字段将为空。(参见RFC 7230,第5.3节)//// 对于客户端请求,URL的Host指定要连接的服务器,而Request的Host字段可选择地指定要在HTTP请求中发送的Host头的值。URL *url.URL// 传入服务器请求的协议版本。//// 对于客户端请求,这些字段被忽略。HTTP客户端代码始终使用HTTP/1.1或HTTP/2。// 有关详情,请参阅Transport的文档。Proto      string // "HTTP/1.0"ProtoMajor int    // 1ProtoMinor int    // 0// Header包含要发送给服务器的请求头字段,或服务器接收的请求头字段。//// 如果服务器收到带有头行的请求,////	Host: example.com//	accept-encoding: gzip, deflate//	Accept-Language: en-us//	fOO: Bar//	foo: two//// 则////	Header = map[string][]string{//		"Accept-Encoding": {"gzip, deflate"},//		"Accept-Language": {"en-us"},//		"Foo": {"Bar", "two"},//	}//// 对于传入的请求,Host头将提升为Request.Host字段,并从Header映射中删除。//// HTTP定义了头名称不区分大小写。请求解析器通过使用CanonicalHeaderKey来实现这一点,// 使得首字母和连接符后的任何字符变为大写,其余字符变为小写。//// 对于客户端请求,某些头部,如Content-Length和Connection,在需要时会自动写入,// 并且Header中的值可能会被忽略。请参阅Request.Write方法的文档。Header Header// Body是请求的主体。//// 对于客户端请求,nil主体表示请求没有主体,例如GET请求。// HTTP客户端的Transport负责调用Close方法。//// 对于服务器请求,请求主体始终为非nil,但当没有主体时将立即返回EOF。// 服务器将关闭请求主体。ServeHTTP处理程序不需要这样做。//// Body必须允许在Close的同时调用Read。// 特别是,调用Close应该解除等待输入的Read。Body io.ReadCloser// GetBody定义了一个可选的函数,用于返回Body的新副本。// 当重定向需要多次读取主体时,客户端请求会使用它。// 使用GetBody仍然需要设置Body。//// 对于服务器请求,它未使用。GetBody func() (io.ReadCloser, error)// ContentLength记录相关内容的长度。// 值-1表示长度未知。// 值>= 0表示可以从Body读取给定字节数。//// 对于客户端请求,值为0且Body非nil也被视为未知。ContentLength int64// TransferEncoding列出了从最外层到最内层的传输编码。// 空列表表示“identity”编码。// 当发送和接收请求时,可以通常忽略TransferEncoding;// 在需要时,chunked编码将自动添加和删除。TransferEncoding []string// Close指示在回复此请求后(对于服务器)或发送此请求并读取其响应后(对于客户端)是否关闭连接。//// 对于服务器请求,HTTP服务器会自动处理这一点,并且处理程序不需要此字段。//// 对于客户端请求,设置此字段将防止在相同主机的请求之间重用TCP连接,就像设置了Transport.DisableKeepAlives一样。Close bool// 对于服务器请求,Host指定要搜索URL的主机。// 对于HTTP/1(根据RFC 7230,第5.4节),这要么是“Host”头的值,要么是URL本身中给出的主机名。// 对于HTTP/2,它是“:authority”伪标头字段的值。// 它可以是“host:port”的形式。对于国际域名,Host可能是Punycode或Unicode形式。// 如果需要,可以使用golang.org/x/net/idna将其转换为任何一种格式。// 为了防止DNS重新绑定攻击,服务器处理程序应验证Host头具有处理程序认为自己是权威的值。// ServeMux包含对特定主机名注册的模式,因此可以保护其注册的处理程序。//// 对于客户端请求,Host可选地覆盖要发送的Host头。// 如果为空,则Request.Write方法使用URL.Host的值。Host可能包含国际域名。Host string// Form包含解析的表单数据,包括URL字段的查询参数和PATCH、POST或PUT表单数据。// 只有在调用ParseForm之后才能使用此字段。// HTTP客户端会忽略Form,并使用Body。Form url.Values// PostForm包含来自PATCH、POST或PUT主体参数的解析的表单数据。//// 只有在调用ParseForm之后才能使用此字段。// HTTP客户端会忽略PostForm,并使用Body。PostForm url.Values// MultipartForm是解析的多部分表单,包括文件上传。// 只有在调用ParseMultipartForm之后才能使用此字段。// HTTP客户端会忽略MultipartForm,并使用Body。MultipartForm *multipart.Form// Trailer指定在请求主体之后发送的附加标头。//// 对于服务器请求,Trailer映射最初只包含尾部键,其值为nil。// (客户端声明它将稍后发送哪些尾部。)// 在处理程序从Body中读取时,它不得引用Trailer。// 读取自Body返回EOF后,Trailer可以再次读取,并且如果它们由客户端发送,则将包含非nil值。//// 对于客户端请求,必须将Trailer初始化为包含要稍后发送的尾部键的映射。// 值可以为nil或其最终值。// ContentLength必须为0或-1,以发送分块请求。// 在发送HTTP请求后,可以在读取请求主体的同时更新映射值。// 一旦主体返回EOF,调用者就不能改变Trailer。//// 很少有HTTP客户端、服务器或代理支持HTTP尾部。Trailer Header// RemoteAddr允许HTTP服务器和其他软件记录发送请求的网络地址,通常用于日志记录。// 此字段不会被ReadRequest填充,并且没有定义的格式。// 此包中的HTTP服务器在调用处理程序之前将RemoteAddr设置为“IP:port”地址。// HTTP客户端会忽略此字段。RemoteAddr string// RequestURI是由客户端发送到服务器的Request-Line(RFC 7230,第3.1.1节)的未修改的请求目标。// 通常应使用URL字段。// 在HTTP客户端请求中设置此字段是错误的。RequestURI string// TLS允许HTTP服务器和其他软件记录接收到请求的TLS连接的信息。// 此字段不会由ReadRequest填充。// 此包中的HTTP服务器在调用处理程序之前为启用TLS的连接设置字段;// 否则,它将保留字段为nil。// HTTP客户端会忽略此字段。TLS *tls.ConnectionState// Cancel是一个可选的通道,其关闭指示应将客户端请求视为已取消。// 并非所有的RoundTripper实现都支持Cancel。//// 对于服务器请求,此字段不适用。//// 已弃用:请使用NewRequestWithContext设置Request的上下文,而不是Cancel字段。// 如果一个Request的Cancel字段和上下文都被设置了,那么未定义是否Cancel会被尊重。Cancel <-chan struct{}// Response是导致创建此请求的重定向响应。此字段仅在客户端重定向期间填充。Response *Response// ctx是客户端或服务器上下文。// 应该仅通过复制整个Request使用WithContext来修改它。// 它是未导出的,以防止人们错误地使用Context并改变调用相同请求的调用者持有的上下文。ctx context.Context
}

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

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

相关文章

制作跳动的爱心网页效果

html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>跳动的爱心</title> <link rel&q…

Chatgpt的应用场景

文案创作类&#xff1a; 作为一名大型语言模型&#xff0c;ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务&#xff0c;例如&#xff1a; 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落&#xff0c;生成符合使用者要求的新文本。这些文本可以是文…

Linux:Figshare网站文件下载(非浏览器)

参考aws亚马逊云下载figshare内容 Linux wget -c 下载网页内容crul -C_figshare怎么下载数据-CSDN博客 尝试一下 mamba search awscli mamba install awscli2.15.48 aws --version通过网页获取下载链接 比如&#xff1a; https://s3-eu-west-1.amazonaws.com/pfigshare-u-…

Centos 停服倒计时!你的操作系统何去何从?

在计算机技术的不断演进中&#xff0c;操作系统扮演着至关重要的角色。然而&#xff0c;对于许多企业和个人用户来说&#xff0c;CentOS的突然停服消息带来了一场不小的冲击。作为一款备受欢迎的企业级Linux发行版&#xff0c;CentOS的停服意味着用户需要重新评估自己的操作系统…

如何清除DNS缓存,刷新DNS

大家在使用域名访问服务器的时候&#xff0c;经常会遇到一个问题&#xff0c;同一个局域网里的两台电脑&#xff0c;一台可以访问而另一台不行。这是为什么呢&#xff1f;这里我要和大家说下DNS缓存的问题&#xff0c;顾名思义&#xff0c;每台电脑都有DNS缓存&#xff0c;在域…

2024年数维杯数学建模

高质量原创论文已完成 需要的私我

虚拟化技术 安装和配置StartWind iSCSI目标服务器

一、实验内容 安装StartWind iSCSI目标服务器配置StartWind iSCSI目标服务器 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装vSphere Client已创建虚拟机并在其上安装CentOS6.5StarWind安装介质starwind.…

科技查新中化工领域查新点如何确立与提炼?案例讲解!

我国化工科技查新工作始于1985年&#xff0c;至今经历了30多年的发展。化工类课题包含化工、炼油、 冶金、能源、轻工、石化、环境、医药、环保和军工等&#xff0c; 具有物质种类繁多、制备工艺复杂等特点。因此&#xff0c;本文结合化工查新项目实例&#xff0c;总结提高化工…

数组二叉树-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 二叉树也可以用数组来存储&#xff0c;给定一个数组&#xff…

08.3.grafana自定义图形

grafana自定义图形 找插件里面的zabbix 点击update 数据源—zabbix数据源,添加zabbix数据源 选择zabbix类型 我这里配置的是本地&#xff0c;所以URL直接localhost 这里配置zabbix登录账号密码Admin/zabbix 然后点击保存并测试&#xff0c;会直接显示版本 导入模板&…

【Web】2023香山杯决赛 security system 题解

目录 step -1 step 0 step 1 step 2 step 3 step -1 ①题目hint&#xff1a;想办法修改属性值后进入java的原生反序列化&#xff0c;然后利用jackson链写入内存马 ②jackson反序列化基础&#xff1a; ObjectMapper objectMapper new ObjectMapper(); String jsonStrin…

【GESP】2024年03月图形化二级 -- 找因数

找因数 【题目描述】 默认小猫角色和白色背景。 小杨最近刚刚学习了因数的概念&#xff0c;具体来说&#xff0c;如果一个正整数 a a a 可以被另一个正整数 b b b 整除&#xff0c;那么我们就说 b b b 是 a a a 的因数&#xff0c;例如6可以被1、2、3、6整除&#xff0c;…

通过物联网管理多台MQTT设备-基于米尔T527开发板

本篇测评由电子工程世界的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-LT527开发板的网关方案测试。 一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关&#xff0c;该网关能够管理多台MQTT设备&#xff0c;通过MQTT协议对设备进行读写操作&#xff0c;…

i春秋-Test

题目 解题 参考WP https://blog.csdn.net/qq_40654505/article/details/107142533/目录扫描 复现wp payload为&#xff1a; search.php?searchtype5&tid&areaeval($_POST[cmd])使用蚁剑连接 http://eci-2ze4iyhwj7xvb68bsb2t.cloudeci1.ichunqiu.com:80/search.ph…

在 Navicat 17 中探索表配置文件

距离 Navicat 17&#xff08;英文版&#xff09;的发布还有不到一周的时间&#xff0c;现在是深入研究新的表配置文件功能的最佳时机。它允许我们保存经常用于表的筛选、排序和列显示的不同组合。所以&#xff0c;事不宜迟&#xff0c;让我们开始吧&#xff01; 创建表配置文件…

leetcode——反转链表

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;创建三个指针n1,n2,n3&#xff0c;遍历原链表&#xff0c;通过三者之间的关系将链表反转。下面给出图示&#xff1a; 下面给出题解代码&#xff1a; typedef struct ListNode ListNode; struct List…

parallels desktop19最新免费Mac电脑虚拟机软件

Parallels Desktop是一款运行在Mac电脑上的虚拟机软件&#xff0c;它允许用户在Mac系统上同时运行多个操作系统&#xff0c;比如Windows、Linux等。通过这款软件&#xff0c;Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序&#xff0c;而无需额外的硬件设备…

自拍欺骗成为流行的身份证件欺诈技术

据 Socure 称&#xff0c;文档图像叠加是 2023 年最流行的身份证件欺诈技术&#xff0c;在所有被拒绝的身份证件中&#xff0c;有 63% 发生这种情况。 自拍欺骗和冒充在与文件相关的身份欺诈中占主导地位 当用户拍摄照片或使用 ID 的屏幕截图图像&#xff08;而不是提供文档的…

26、Flink 的状态数据结构升级

状态数据结构升级 a&#xff09;概述 Flink 流应用通常被设计为永远或者长时间运行&#xff0c;与所有长期运行的服务一样&#xff0c;应用程序需要随着业务的迭代而进行调整&#xff0c;应用所处理的数据 schema 也会随着进行变化。 升级状态类型的数据 schema &#xff0c…

初始Java篇(JavaSE基础语法)(8)认识String类(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 简单介绍&#xff1a;在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可…