02 Go语言开发REST API接口_20240728 课程笔记

概述

如果您没有Golang的基础,应该学习如下前置课程。

  • Golang零基础入门
  • Golang面向对象编程
  • Go Web 基础

基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。

视频课程

最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第4部,后续还会有很多。

视频已经录制完成,完整目录截图如下:
在这里插入图片描述

打个小广告,目前处于特价阶段,一节课只需要1块钱,24节课只需要24元哦。如果有需要,请前往我的淘宝店铺“Python私教”下单。

课程目录

  • 01 环境搭建
  • 02 关于年月日版本不被支持的说明
  • 03 返回JSON字典
  • 04 Go语言通过replace查找本地库的用法
  • 05 封装JsonMap方法
  • 06 使用封装的JsonMap方法
  • 07 优化JsonMap方法
  • 08 返回JSON数组
  • 09 封装ResponseJsonArr方法
  • 10 返回JSON结构体
  • 11 封装ResponseJsonStruct方法
  • 12 统一返回格式
  • 13 封装ResponseSuccess方法
  • 14 发送GET请求
  • 15 获取查询参数
  • 16 封装GetQuery和GetQueryInt方法
  • 17 获取获取查询参数的方式
  • 18 发送和获取表单参数
  • 19 封装GetForm方法
  • 20 封装SendForm方法
  • 21 发送和获取JSON
  • 22 获取路径参数
  • 23 发送PUT请求
  • 24 发送DELETE请求

完整代码

01 环境搭建

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {fmt.Fprint(w, "Welcome!\n")
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

02 关于年月日版本不被支持的说明

03 返回JSON字典

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")m := make(map[string]string)m["a"] = "张三"m["b"] = "李四"// 将字段转换为JSONjsonBytes, err := json.Marshal(m)if err != nil {fmt.Println(err)fmt.Fprintf(w, err.Error())return}fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

04 Go语言通过replace查找本地库的用法

05 封装JsonMap方法

06 使用封装的JsonMap方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {m := make(map[string]interface{})m["a"] = "张三333"m["b"] = "李四333"zdpgo_httprouter.ResponseJsonMap(w, m)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

07 优化JsonMap方法

08 返回JSON数组

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")var arr []interface{}arr = append(arr, "张三")arr = append(arr, "李四")arr = append(arr, "王五")// 将字段转换为JSONjsonBytes, err := json.Marshal(arr)if err != nil {fmt.Fprintf(w, err.Error())return}// 返回JSON信息fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

09 封装ResponseJsonArr方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var arr []interface{}arr = append(arr, "张三333")arr = append(arr, "李四333")arr = append(arr, "王五333")zdpgo_httprouter.ResponseJsonArr(w, arr)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

10 返回JSON结构体

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")u := User{"张三", 33}// 将字段转换为JSONjsonBytes, err := json.Marshal(u)if err != nil {fmt.Fprintf(w, err.Error())return}// 返回JSON信息fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

11 封装ResponseJsonStruct方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {u := User{"张三333", 333}zdpgo_httprouter.ResponseJsonStruct(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

12 统一返回格式

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type SuccessResult struct {Code    int         `json:"code"`Status  bool        `json:"status"`Message string      `json:"message"`Data    interface{} `json:"data,omitempty"`
}type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")u := User{"张三", 33}s := SuccessResult{10000, true, "success", u}// 将字段转换为JSONjsonBytes, err := json.Marshal(s)if err != nil {fmt.Fprintf(w, err.Error())return}// 返回JSON信息fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

13 封装ResponseSuccess方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {u := User{"张三333", 333}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

14 发送GET请求

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {u := User{"张三333", 333}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("http://localhost:8888/")if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

15 获取查询参数

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""strconv""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := r.URL.Query().Get("name")age := r.URL.Query().Get("age")ageInt, _ := strconv.ParseInt(age, 10, 64)u := User{name, int(ageInt)}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("http://localhost:8888/?name=张三333&age=33")if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

16 封装GetQuery和GetQueryInt方法

17 获取查询参数的方式

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := zdpgo_httprouter.GetQuery(r, "name")age := zdpgo_httprouter.GetQueryInt(r, "age")u := User{name, age}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("http://localhost:8888/?name=张三33&age=33")if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

18 发送和获取表单参数

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""strconv""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {r.ParseForm()fmt.Println(r.PostForm)name := r.PostForm.Get("name")age := r.PostForm.Get("age")ageInt, _ := strconv.ParseInt(age, 10, 64)u := User{name, int(ageInt)}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("bytes""fmt""io""log""net/http""net/url"
)func main() {targetUrl := "http://localhost:8888/"// 用url.values方式构造form-data参数formValues := url.Values{}formValues.Set("name", "张三")formValues.Set("age", "23")formDataStr := formValues.Encode()formDataBytes := []byte(formDataStr)formBytesReader := bytes.NewReader(formDataBytes)//生成post请求client := &http.Client{}req, err := http.NewRequest("POST", targetUrl, formBytesReader)if err != nil {// handle errorlog.Fatal("生成请求失败!", err)return}//注意别忘了设置headerreq.Header.Set("Content-Type", "application/x-www-form-urlencoded")// Do方法发送请求resp, err := client.Do(req)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

19 封装GetForm方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := zdpgo_httprouter.GetForm(r, "name")age := zdpgo_httprouter.GetFormInt(r, "age")u := User{name, age}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("bytes""fmt""io""log""net/http""net/url"
)func main() {targetUrl := "http://localhost:8888/"// 用url.values方式构造form-data参数formValues := url.Values{}formValues.Set("name", "张三")formValues.Set("age", "23")formDataStr := formValues.Encode()formDataBytes := []byte(formDataStr)formBytesReader := bytes.NewReader(formDataBytes)//生成post请求client := &http.Client{}req, err := http.NewRequest("POST", targetUrl, formBytesReader)if err != nil {// handle errorlog.Fatal("生成请求失败!", err)return}//注意别忘了设置headerreq.Header.Set("Content-Type", "application/x-www-form-urlencoded")// Do方法发送请求resp, err := client.Do(req)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

20 封装SendForm方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := zdpgo_httprouter.GetForm(r, "name")age := zdpgo_httprouter.GetFormInt(r, "age")u := User{name, age}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]string{"name": "张三","age":  "23",}resp, err := zdpgo_httprouter.SendForm(targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

21 发送和获取JSON

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var u Usererr := zdpgo_httprouter.GetJson(r, &u)if err != nil {fmt.Fprintf(w, "err:%v", err)return}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]interface{}{"name": "张三","age":  23,}resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

22 获取路径参数

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {id := ps.ByName("id")data := map[string]interface{}{"id":   id,"name": "张三","age":  23,}zdpgo_httprouter.ResponseSuccess(w, data)
}func main() {router := zdpgo_httprouter.New()router.GET("/:id", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {targetUrl := "http://localhost:8888/3"resp, err := http.Get(targetUrl)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

23 发送PUT请求

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var u Usererr := zdpgo_httprouter.GetJson(r, &u)if err != nil {fmt.Fprintf(w, "err:%v", err)return}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.PUT("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]interface{}{"name": "张三","age":  23,}resp, err := zdpgo_httprouter.SendJson("PUT", targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

24 发送DELETE请求

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var u Usererr := zdpgo_httprouter.GetJson(r, &u)if err != nil {fmt.Fprintf(w, "err:%v", err)return}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.DELETE("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]interface{}{"name": "张三","age":  23,}resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

总结

本套教程主要讲解Go REST API开发的基础知识,特别是讲解了httprouter的用法以及一些便捷函数的封装,并附上了完整的实战代码。

通过本套课程,能帮你入门Go REST API 接口开发,写一些简单的API程序。

如果您需要完整的源码,打赏20元即可。

人生苦短,我用Python,我是您身边的Python私教~

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

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

相关文章

探索Python监控之眼:watchdog库深度解析

文章目录 探索Python监控之眼:watchdog库深度解析1. 引言:为何选择watchdog?2. watchdog简介3. 安装watchdog库4. 基本函数与使用方法4.1 初始化监控器4.2 监控文件的创建4.3 监控文件的删除4.4 监控目录的创建4.5 监控目录的删除 5. 场景应用…

一文读懂JS事件循环、事件冒泡与事件委托

引言 JavaScript 是一种广泛使用的编程语言,特别是在前端开发领域。为了理解 JavaScript 中的异步行为和事件处理机制,我们需要深入了解事件循环、事件冒泡和事件委托等概念。本文将详细解释这些概念及其在实际编程中的应用。 1. JavaScript 事件循环 …

IoTDB 入门教程 实战篇②——MQTT集成

文章目录 一、前文二、配置参数三、开放端口四、MQTT客户端连接五、推送数据六、查询数据八、参考 一、前文 IoTDB入门教程——导读 IoTDB时序数据库内置MQTT服务器,允许远程设备将消息直接发送到IoTDB内置的MQTT服务器,并可以直接存入IoTDB时序数据库。…

gitee的远程连接与公钥SSH的连接

目录 1. 登录注册gitee1.1 登录注册1.2 创建仓库 2. 远程连接3. 公钥连接4. 参考链接 1. 登录注册gitee 1.1 登录注册 gitee官网 进入后进行登录注册 1.2 创建仓库 2. 远程连接 在你想要上传文件的文件夹中进行git初始化(我在其他文章已经写过,链接…

新手小白,如何新建一个springboot的web项目?

第一步:打开软件,点击file,点击new 然后选择module,在右侧选择springboot 第二步:选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选择java8版本 ④选择jar包类型 http://t.csdnimg.cn/XeplRhttp:…

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中,Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中,包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案,使用 React 语法规范来开发多端应用(包括小程序、H5、React Native 等)。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目(本来就有的旧项目)的步…

OTA远程升级语音芯片”在线更新语音内容的方式有哪几种?分别如何使用及有什么优势?

一:【在板更新】在PCBA上预留语音芯片烧录口,通过配套下载器更新语音芯片中的语音文件。 如何使用,有什么优势? 1.研发设计阶段、调试阶段可以使用下载器更换PCBA上面的语音文件,无需重新购买IC,大大缩短项目周期。 2.产品一样,但是需要出口到不同国…

request编码方式Content-Type以及params和data传参

编码x-www-form-urlencoded Content-Type: application/x-www-form-urlencoded 是一种HTTP头部信息,用于指定请求或响应正文的内容类型。 具体来说: Content-Type 是HTTP头部字段,它指示了随后发送或接收的实体正文的媒体类型。 applicati…

Mybatis框架基础知识

Mybatis 1.1什么是Mybatis 1.MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 2.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 3.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO…

redis的使用场景-热点数据缓存

1.什么是缓存? 把一些经常访问的数据放入缓存中,减少访问数据库的频率,减少数据库的压力,从而提高程序的性能。【内存中存储】 2.缓存的原理 通过上图可以看出程序首先访问缓存,如果缓存中有访问的数据会直接方会给客…

Avalonia中的路由事件

文章目录 一、路由事件的基本概念事件路由机制事件的生命周期二、创建路由事件定义路由事件触发路由事件处理路由事件三、使用路由事件的场景用户输入控件交互动画和样式数据绑定和验证四、路由事件的优缺点优点:缺点:五、总结在Avalonia中,路由事件是处理用户交互和控件之间…

Flutter Geocoding插件使用指南:简化地理编码与逆地理编码

Flutter Geocoding插件使用指南:简化地理编码与逆地理编码 简介 geocoding 是一个Flutter插件,提供了简便的地理编码(将地址转换为经纬度坐标)和逆地理编码(将经纬度坐标转换为地址)功能。它利用了iOS和A…

C#判断代码片段为class还是method

判断代码片段是class还是method: public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string codeSnippet1 "public class MyClass{bool bfalse;public void MyMethod(…

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …

NSS [NSSRound#18 Basic]easy_rw

NSS [NSSRound#18 Basic]easy_rw 题目描述:弱口令就完事了 入口:/dolphinscheduler 靶机启动需要1分钟。 这题有两种做法。CVE-2023-48796、CVE-2024-23320 先说CVE-2023-48796 Apache DolphinScheduler是一个分布式、易扩展、可视化的工作流任务调度…

MATLAB学习日志DAY22

动态字段名称 访问结构体中的数据的最常用方法是指定要引用的字段的名称。 访问结构体数据的另一种方法是使用动态字段名称。这些名称将字段表示为变量表达式,MATLAB 会在运行时计算这些表达式。此处显示的 点-括号 语法将 expression 作为动态字段名称&#xff1…

【redis】一致性hash算法和hash槽

普通hash取模 直接hash(key)%N , N为机器的数量,但不利于集器扩容或者缩容 一致性hash算法和hash槽 一致性hash算法是在redis 分片中使用,hash槽在redis cluster(集群)中使用 Redis一致性hash:Redis一致性hash是为…

前端获取当前年月日时分秒

getCurrentTime() {//改时间数据格式var currentTime new Date();const formattedDate ${currentTime.getFullYear()}-${this.padZero(currentTime.getMonth() 1)}-${this.padZero(currentTime.getDate())} ${this.padZero(currentTime.getHours())}:${this.padZero(currentTi…

Netdevops入门之Telnetlib语法案例

1、Telnetlib模块: 支持telnet/ssh远程访问的模块很多,常见的有telnetlib、ciscolib、paramiko、netmiko、pexpect,其中telnetlib和ciscolib对应telnet协议,后面3个对应SSH协议。 ①-通过ENSP环境搭建实验环境 ②-基础语法-telnetlib案例1&…