Go 1.19.4 HTTP编程-Day 20

1. HTTP协议

1.1 基本介绍

  • HTTP协议又称超文本传输协议,属于应用层协议,在传输层使用TCP协议。
  • HTTP协议属是无状态的,对事务处理没有记忆能力,如果需要保存状态需要引用其他技术,如Cookie。
  • HTTP协议属是无连接的,每次连接只处理一个请求。因为早期带宽和计算资源有限,这么做是为了加快传输速度,后来通过Connection:Keep-Alive实现了长连接。
  • http1.1废弃了Keep-Alive,默认支持长连接。

1.2 http requst(请求报文)

(1)请求行:GET / HTTP/1.1

  • GET:请求方法。
  • /:URL(请求路径)
  • 协议版本:HTTP/1.1

(2)请求头

  • Host: www.baidu.com:告诉服务器请求的目标地址。
  • User-Agent: curl/7.65.0:表明请求是由curl工具发起的,版本是7.65.0。
  • Accept: */*:表示客户端可以接受任何类型的响应内容。

如果是POST请求,那么请求头中的内容更多。如:

  • Accept-Language: en-US,en:客户端可接受的语言。
  • Accept-Encoding: gzip, deflate, br:客户端能够处理的压缩格式。
  • Authorization: Bearer token_value:如果需要认证,此处包含认证(证书)信息。
  • Cache-Control: no-cache:指定请求和响应遵循的缓存机制。no-cache表示无缓存机制。
  • 等等其他内容。

(3)空行

就Accept: */*下面那个空行。


(4)请求正文

注意:GET请求,是没有请求正文的。举例一个POST请求:

name=John+Doe&age=30,这就是POST请求的请求主正文。

1.3 请求方法介绍

请求方法含义
GET请求获取Request-URI所标识的资源,如下载一张图片。
POST向服务器提交数据进行处理,比如提交表单或者上传文件。数据通常放在请求正文中。
HEAD类似于GET,但是返回的响应中没有具体的内容。主要用于获取响应头部。
PUT上传文件或提交资源到服务器,通常指定了资源的URI。
DELETE请求服务器删除指定的页面。
OPTIONS查看服务端的性能。
TRACE类似于链路追踪,可以看到请求经过了哪些节点以及耗时等。
PATCH类似PUT,但它可以只对资源的一部分进行更新,资源不存在时则创建。

注意:

  • 实际工作中,服务端对各种请求方法的处理方式可能不是按照我们标准的协议来的,比如服务端收到的是PUT请求,但执行的是删除操作,具体还要看开发者怎么定义。
  • 大多数浏览器只支持GET和POST。

1.4 http response(响应报文)

(1)响应状态行:HTTP/1.1 200 OK

  • HTTP/1.1:表示请求协议版本。
  • 200:表示请求状态码。
  • OK:表示状态消息。

(2)响应头

  • Accept-Ranges: bytes:表示服务器能够接受以字节为单位的范围请求。
  • Cache-Control:指示响应不能被缓存。
  • Connection: keep-alive:表示这个TCP连接在发送完响应后不会关闭,可以被重用。
  • Content-Length: 2381:响应体的长度是2381字节。
  • Content-Type: text/html:响应体的类型是HTML。
  • Date:响应生成的日期和时间。
  • Etag:资源的一个特定版本的标识。
  • Last-Modified:资源最后被修改的日期和时间。
  • Pragma: no-cache:一个指令,要求请求和响应遵循HTTP/1.0的缓存机制,不要缓存。
  • Server: bfe/1.0.8.18:服务器使用的软件信息。
  • Set-Cookie:服务器设置了一个名为BDOZ的cookie,有效期为86400秒,域名为.baidu.com。

(3)空行


(4)响应报文主体

  • <!DOCTYPE html> ... </html>

1.5 URL和URI

1.5.1 基本介绍

  • URI:统一资源标识符(Uniform Resource Identifier),是一个用于标识资源的字符串。它提供了一种方式,通过该方式可以唯一地标识互联网上的资源,但没有提供访问方式
  • URL:统一资源定位符(Uniform Resource Locator),是URI的一种,用于定位资源。它不仅标识资源,还提供了如何通过互联网访问该资源的具体信息

1.5.2 示例

2. go语言http标准库

在go中实现http编程,主要是使用go包中的net/http。

net:net包为网络I/O提供了一个可移植的接口,包括TCP/IP、UDP、域名解析和Unix域套接字。

  • http:http 包提供了 HTTP 客户端和服务器实现。
  • 其余协议参考官网。

2.1 GET请求

2.1.1 http服务端

2.1.1.1 编辑代码
package mainimport ("fmt""log""net/http"
)// w http.ResponseWriter, r *http.Request: 为固定写法
func BoyHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "Hello Boy")
}func GirlHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "Hello Girl")
}func main() {// 定义路由// 请求"/boy"路径,就调用BoyHandler函数http.HandleFunc("/boy", BoyHandler)http.HandleFunc("/gir", GirlHandler)// 服务启动后的端口号err := http.ListenAndServe(":5656", nil) // 注意:成功启动的话,就会一直阻塞(没有输出)。if err != nil {log.Panic(err)}
}
2.1.1.2 浏览器请求服务端

2.1.2 http客户端

2.1.2.1 编辑代码并发起GET请求
package mainimport ("io""log""net/http""os"
)func get() {// 定义一个GET请求r, err := http.Get("http://localhost:5656/gir")if err != nil {log.Panic(err)}defer r.Body.Close() // 用完关闭,否则会协程泄露// 因为Body方法没有办法直接打印出来,所以把它复制到标准输出。io.Copy(os.Stdout, r.Body)
}func main() {get()
}
============调试结果============
Hello Girl

2.1.3 增加其他http信息

2.1.3.1 服务端
package mainimport ("fmt""log""net/http"
)// w http.ResponseWriter, r *http.Request: 为固定写法
func BoyHandler(w http.ResponseWriter, r *http.Request) {// 显示请求头for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}fmt.Fprint(w, "Hello Boy\n")
}func GirlHandler(w http.ResponseWriter, r *http.Request) {for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}fmt.Fprint(w, "Hello Girl\n")
}func main() {http.HandleFunc("/boy", BoyHandler)http.HandleFunc("/gir", GirlHandler)err := http.ListenAndServe(":5656", nil)if err != nil {log.Panic(err)}
}
2.1.3.2 客户端
package mainimport ("fmt""io""log""net/http""os"
)func get() {r, err := http.Get("http://localhost:5656/boy")if err != nil {log.Panic(err)}defer r.Body.Close()io.Copy(os.Stdout, r.Body)// 显示响应头for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}// 显示请求协议fmt.Printf("Proto:%v\n", r.Proto)fmt.Printf("Close: %v\n", r.Close)// 显示请求内容长度fmt.Printf("ContentLength: %v\n", r.ContentLength)// 请求协议主版本号fmt.Printf("ProtoMajor: %+v\n", r.ProtoMajor)// 请求协议次版本号fmt.Printf("ProtoMinor: %+v\n", r.ProtoMinor)// 原始请求fmt.Printf("Request: %+v\n", r.Request)// 请求状态,含状态码和OK与否fmt.Printf("Status: %+v\n", r.Status)// 请求状态码fmt.Printf("StatusCode: %+v\n", r.StatusCode)// 请求方法fmt.Printf("Request.Method: %+v\n", r.Request.Method)// 请求地址fmt.Printf("%+v\n", r.Request.URL)// 还有很多内容,这里只展示部分。
}func main() {get()
}

2.1.4 请求测试

2.1.4.1 客户端

2.1.4.2 服务端

2.2 POST请求

2.2.1 服务端代码

package mainimport ("fmt""io""log""net/http""os"
)func BoyHandler(w http.ResponseWriter, r *http.Request) {// 关闭请求主体defer r.Body.Close()// 显示请求主体io.Copy(os.Stdout, r.Body)for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}fmt.Fprint(w, "Hello Boy\n")
}func GirlHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()// 显示请求主体io.Copy(os.Stdout, r.Body)for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}fmt.Fprint(w, "Hello Girl\n")
}func main() {http.HandleFunc("/boy", BoyHandler)http.HandleFunc("/gir", GirlHandler)err := http.ListenAndServe(":5656", nil)if err != nil {log.Panic(err)}
}

2.2.2 客户端代码

package mainimport ("fmt""io""log""net/http""os""strings"
)func get() {r, err := http.Get("http://localhost:5656/boy")if err != nil {log.Panic(err)}defer r.Body.Close()io.Copy(os.Stdout, r.Body)// 显示响应头for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}
}func post() {// 请求服务端要发送的内容(请求主体)r := strings.NewReader("hello server\n")// 构建post请求r2, err := http.Post("http://localhost:5656/boy", "text/plain", r)if err != nil {log.Panic(err)}defer r2.Body.Close()io.Copy(os.Stdout, r2.Body)for k, v := range r2.Header {fmt.Printf("%v: %v\n", k, v)}
}func main() {post()
}

2.2.3 请求测试

2.3 POST请求进阶版

使用函数:

  • http.NewRequest(method string, url string, body io.Reader) (*http.Request, error)

参数:

  • method string:请求的方法,比如 "GET"、"POST"、"PUT"、"DELETE" 等。
  • url string:请求的 URL,可以是一个完整的 URL 字符串。
  • body io.Reader:请求的主体(body),它是一个 io.Reader 接口,可以是 nil,表示没有请求体。

返回值:

  • *http.Request:一个新建的 HTTP 请求对象。
  • error:如果在创建请求的过程中出现错误,这个错误对象会被返回,否则为 nil

2.3.1 服务端代码编辑

package mainimport ("fmt""io""log""net/http""os"
)func BoyHandler(w http.ResponseWriter, r *http.Request) {// 关闭请求主体defer r.Body.Close()// 显示请求主体io.Copy(os.Stdout, r.Body)// 显示请求头for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}// 显示Cookiesfor _, cokkie := range r.Cookies() {fmt.Printf("%v: %v\n", cokkie.Name, cokkie.Value)}fmt.Fprint(w, "Hello Boy\n")
}func GirlHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()// 显示请求主体io.Copy(os.Stdout, r.Body)for k, v := range r.Header {fmt.Printf("%v: %v\n", k, v)}fmt.Fprint(w, "Hello Girl\n")
}func main() {http.HandleFunc("/boy", BoyHandler)http.HandleFunc("/gir", GirlHandler)err := http.ListenAndServe(":5656", nil)if err != nil {log.Panic(err)}
}

2.3.2 客户端代码编辑

package mainimport ("fmt""io""log""net/http""os""strings""time"
)func complexHttpRequest() {reader := strings.NewReader("hello server\n")req, err := http.NewRequest("POST", "http://localhost:5656/boy", reader)if err != nil {log.Panic(err)} else {// 增加自定义请求头req.Header.Add("User-Agent", "中国")req.Header.Add("MyHeaderKey", "MyHeaderValue")// 增加自定义Cokkiereq.AddCookie(&http.Cookie{// 传给服务端的信息Name:  "auth",Value: "passwd",// 下面这3行信息,主要是作为记录,并不传给服务端Path:    "/",Domain:  "localhost",Expires: time.Now().Add(time.Duration(time.Hour)),})client := &http.Client{// Timeout: 100 * time.Microsecond, // 客户端等待服务端响应的超时时间为100毫秒Timeout: 10 * time.Second, // 客户端等待服务端响应的超时时间为10秒}// 提交http请求resp, err2 := client.Do(req)if err2 != nil {log.Panic(err2)} else {// 成功提交请求且拿到响应后,第一件事就是关闭请求defer resp.Body.Close()// 显示响应内容io.Copy(os.Stdout, resp.Body)for k, v := range resp.Header {fmt.Printf("%s: %v\n", k, v)}fmt.Println(resp.Proto)fmt.Println(resp.Status)}}}func main() {complexHttpRequest()
}

2.3.3 请求测试

2.3.3.1 客户端请求

2.3.3.2 服务端

3. http router

3.1 基本介绍

http routerGo语言 中用于处理 HTTP请求 的组件。它能够识别 URLHTTP方法(如GET、POST),并将请求分发到对应的处理函数。

  • 下载:go get -u github.com/julienschmidt/httprouter
  • Router实现了http.Handler接口。
  • 为各种request method提供了便捷的路由方式。
  • 支持restful请求方式。
  • 支持ServerFiles访问静态文件(如html)。
  • 可以自定义捕获panic的方法。

3.2 编辑服务端代码

package mainimport ("fmt""io""net/http""os""github.com/julienschmidt/httprouter"
)func handle(method string, w http.ResponseWriter, r *http.Request) {fmt.Printf("request method: %v\n", r.Method)fmt.Print("request boy: \n")io.Copy(os.Stdout, r.Body)// defer r.Body.Close()// fmt.Fprint(w, "Hello boy")// 或者(上下等价)w.Write([]byte("Hello boy, your request method is " + method))
}func get(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("GET", w, r)
}func post(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("POST", w, r)
}func main() {// 定义一个routerrouter := httprouter.New()router.GET("/", get)router.POST("/", post)// 服务启动后监听的端口号http.ListenAndServe(":5656", router)
}

3.3 测试

3.3.1 GET方法测试

3.3.2 POST方法测试

3.4 RESTful风格(POST传参)

3.4.1 服务端代码

package mainimport ("fmt""io""net/http""os""github.com/julienschmidt/httprouter"
)func handle(method string, w http.ResponseWriter, r *http.Request) {fmt.Printf("request method: %v\n", r.Method)// fmt.Print("request boy: \n")io.Copy(os.Stdout, r.Body)// defer r.Body.Close()// fmt.Fprint(w, "Hello boy")// 或者(上下等价)w.Write([]byte("Hello boy, your request method is " + method))
}func get(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("GET", w, r)
}func post(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("POST", w, r)
}func main() {// 定义一个routerrouter := httprouter.New()router.GET("/", get)router.POST("/", post)// /user:是我们请求的路径。// :name:占位符,假定为请求时传递的用户名(参数)// :type:占位符,假定为请求时传递的类型(参数)// *addr:占位符,*表示可以匹配多级路径(参数)router.POST("/user/:name/:type/*addr", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {fmt.Printf("name: %v\ntype: %v\naddr: %v", p.ByName("name"), p.ByName("type"), p.ByName("addr"))})// 服务启动后监听的端口号http.ListenAndServe(":5656", router)
}

3.4.2 客户端代码

package mainimport ("fmt""io""log""net/http""os""strings""time"
)func complexHttpRequest() {reader := strings.NewReader("hello server\n")req, err := http.NewRequest("POST", "http://localhost:5656/user/sanhua/vip/shahnghai/changning/GDAS", reader)if err != nil {log.Panic(err)} else {// 增加自定义请求头req.Header.Add("User-Agent", "中国")req.Header.Add("MyHeaderKey", "MyHeaderValue")// 增加自定义Cokkiereq.AddCookie(&http.Cookie{// 传给服务端的信息Name:  "auth",Value: "passwd",// 下面这3行信息,主要是作为记录,并不传给服务端Path:    "/",Domain:  "localhost",Expires: time.Now().Add(time.Duration(time.Hour)),})client := &http.Client{// Timeout: 100 * time.Microsecond, // 客户端等待服务端响应的超时时间为100毫秒Timeout: 10 * time.Second, // 客户端等待服务端响应的超时时间为10秒}// 提交http请求resp, err2 := client.Do(req)if err2 != nil {log.Panic(err2)} else {// 成功提交请求且拿到响应后,第一件事就是关闭请求defer resp.Body.Close()// 显示响应内容io.Copy(os.Stdout, resp.Body)for k, v := range resp.Header {fmt.Printf("%s: %v\n", k, v)}fmt.Println(resp.Proto)fmt.Println(resp.Status)}}}func main() {complexHttpRequest()
}

3.4.3 请求测试

3.4.3.1 客户端

3.4.3.2 服务端

下图可以看到,服务端把客户端请求时的传参,提取出来了。

3.5 指定静态html文件

3.5.1 准备html文件

这是我在网上随便找的一个静态页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;background-image: linear-gradient(to right, #999999, #330867);}.login-wrapper {background-color: bisque;width: 358px;height: 588px;border-radius: 15px;padding: 0 50px;position: relative;left: 50%;top: 50%;transform: translate(-50%,-50%);}.header {font-size: 38px;font-weight: bold;text-align: center;line-height: 200px;}.input-item {display: block;width: 100%;margin-bottom: 20px;border: 0;padding: 10px;border-bottom: 1px solid rgb(128,125,125);font-size: 15px;outline: none;}.input-item::placeholder {text-transform: uppercase;}.btn {text-align: center;padding: 10px;width: 100%;margin-top: 40px;background-image: linear-gradient(to right,#a6c1ee, #fbc2eb);color: #fff;}.msg {text-align: center;line-height: 88px;}a {text-decoration-line: none;color: #abc1ee;}</style>
</head>
<body><div class="container"><div class="login-wrapper"><div class="header">Login</div><div class="form-wrapper"><input type="text" name="username" placeholder="username" class="input-item"><input type="password" name="password" placeholder="password" class="input-item"><div class="btn">Login</div></div><div class="msg">Don't have account?<a href="#">Sign up</a></div></div></div>
</body>
</html>

3.5.2 服务端代码

package mainimport ("fmt""io""net/http""os""github.com/julienschmidt/httprouter"
)func handle(method string, w http.ResponseWriter, r *http.Request) {fmt.Printf("request method: %v\n", r.Method)// fmt.Print("request boy: \n")io.Copy(os.Stdout, r.Body)// defer r.Body.Close()// fmt.Fprint(w, "Hello boy")// 或者(上下等价)w.Write([]byte("Hello boy, your request method is " + method))
}func get(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("GET", w, r)
}func post(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("POST", w, r)
}func main() {// 定义一个routerrouter := httprouter.New()router.GET("/", get)router.POST("/", post)// 请求/file路径,服务端就会去static目录下读取a.html文件中的内容router.ServeFiles("/file/*filepath", http.Dir("D:/个人/GO开发/20240624/static"))// 服务启动后监听的端口号http.ListenAndServe(":5656", router)
}

3.5.3 请求测试

3.6 错误处理

在实际工作中,可能会有很多路由规则,在任何一处都有可能会报错,所以需要定义一个统一的告警处理。

3.6.1 服务端代码

package mainimport ("fmt""io""net/http""os""github.com/julienschmidt/httprouter"
)func handle(method string, w http.ResponseWriter, r *http.Request) {fmt.Printf("request method: %v\n", r.Method)// fmt.Print("request boy: \n")io.Copy(os.Stdout, r.Body)// defer r.Body.Close()// fmt.Fprint(w, "Hello boy")// 或者(上下等价)w.Write([]byte("Hello boy, your request method is " + method))
}func get(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("GET", w, r)// 手动定义一个数组超界的异常,触发panicvar arr []int_ = arr[1]
}func post(w http.ResponseWriter, r *http.Request, params httprouter.Params) {handle("POST", w, r)
}func main() {// 定义一个routerrouter := httprouter.New()// 错误处理router.PanicHandler = func(w http.ResponseWriter, r *http.Request, i interface{}) {fmt.Fprintf(w, "server panic %v", i)}router.GET("/", get)router.POST("/", post)// 服务启动后监听的端口号http.ListenAndServe(":5656", router)
}

3.6.2 请求测试

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

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

相关文章

Tomcat使用教程

下载地址&#xff1a;https://tomcat.apache.org/ 配置环境变量 变量名: CATALINA_HOME 变量值: D:\tools\apache-tomcat-9.0.97 Path: %CATALINA_HOME%\bin 启动Tomcat(打开命令提示符) startup.bat 解决乱码问题(打开conf\logging.properties) java.util.logging.Conso…

WPF+LibVLC开发播放器-LibVLC在C#中的使用

LibVLC在C#中的使用 安装包Nuget使用控件使用播放器初始化加载视频文件 视频教程&#xff1a; 使用WPFLibVLC快速开发一个播放器 安装包Nuget 安装下面两个包,必须安装两个 一个是相关框架对应的包&#xff0c;Winform就安装LibVLCSharp.Winform;WPF就安装LibVLCSharp.WPF&am…

[创业之路-173]:《BLM战略规划》- 战略洞察 (战略能力中最最核心的能力) - 市场洞察 -3- 看竞争对手-要比你的竞争对手跟了解他们自己

目录 一、五看三定 二、看竞争 2.1 概述 1、分析竞争对手 2、进行价值链分析 3、紧盯标杆对手 4、关注新进入者和替代产品 5、制定竞争策略 2.2 看竞争的主要内容&#xff1a;背景信息、战略、价值定位、价值链、价值交付、组织架构、财务绩效 1、背景信息 2、战略 …

Mysql - 存储引擎

一 MYSQL体系结构简介 MYSQL的体系结构可以分为四个层级&#xff0c;从上往下依次为&#xff1a; 1. 连接层: 最上层为客户端以及一些连接服务&#xff0c;包含连接操作&#xff0c;例如JAVA想要与MYSQL建立连接就需要用到JDBC&#xff0c;PHP语言与Python也可以连接到MYSQL&am…

基于MinIO打造高可靠分布式“本地”文件系统

MinIO是一款高性能的对象存储服务&#xff0c;而S3协议是由亚马逊Web服务&#xff08;AWS&#xff09;制定的一种标准协议&#xff0c;用于云存储服务之间的数据交换。MinIO与S3协议的关系在于&#xff0c;MinIO实现了S3协议的接口&#xff0c;这意味着用户可以使用与AWS S3相同…

电子应用设计方案-43:智能手机充电器系统方案设计

智能手机充电器系统方案设计 一、引言 随着智能手机的广泛应用&#xff0c;对充电器的性能、效率和安全性提出了更高的要求。本方案旨在设计一款高效、安全、兼容多种快充协议的智能手机充电器。 二、系统概述 1. 系统目标 - 提供快速、稳定、安全的充电功能。 - 兼容主流的智…

vue3项目最新eslint9+prettier+husky+stylelint+vscode配置

一、eslint9和prettier通用配置 安装必装插件 ESlint9.x pnpm add eslintlatest -DESlint配置 vue 规则 , typescript解析器 pnpm add eslint-plugin-vue typescript-eslint -DESlint配置 JavaScript 规则 pnpm add eslint/js -D配置所有全局变量 globals pnpm add globa…

【环境搭建】WordPress本地部署搭建及历史版本插件安装(windows系统)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【环境搭建】WordPress本地部署搭建及历史版本插件安装&#xff08;windows系统&#xff09; WordPress搭建环境部署&#xff08;…

qt QTemporaryFile详解

1、概述 QTemporaryFile类是Qt框架中用于创建和管理临时文件的类。它提供了一个安全且便捷的方式来生成唯一的临时文件&#xff0c;这些文件通常用于存储临时数据&#xff0c;如缓存、草稿或中间结果。QTemporaryFile确保了临时文件的唯一性&#xff0c;避免了文件名冲突&…

Gitee配置以及如何将本地项目提交到远程仓库

文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh&#xff0c;输入以下命令&#xff0c;然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网&#xff1a;https://gitee.com 完成注册 新建仓库 头像->设置-…

基于Java和Vue开发的漫画阅读软件漫画阅读小程序漫画APP

前景分析 受众广泛&#xff1a;漫画的受众群体广泛&#xff0c;不仅限于青少年&#xff0c;还涵盖了成年人等多个年龄层和社会阶层。漫画文化在全球范围内的影响力不断扩大&#xff0c;未来漫画软件创业可以考虑全球市场的拓展。 市场需求大&#xff1a;数字化阅读趋势下&…

2024.12.2——[极客大挑战 2019]Secret File 1

知识点&#xff1a;抓包 代码审计 filter伪协议 一、解题步骤 step 1 查看源代码中的信息 查看源代码发现一个php文件&#xff1a;[./Archive_room.php](http://72df1f22-85bf-47bb-b23a-efcaf88701d4.node5.buuoj.cn:81/Archive_room.php) 点进去后发现没什么用&#xff0c…

距离与AoA辅助的三维测距算法,适用于自适应基站数量的情况。订阅专栏后可直接查看完整源代码

本MATLAB 代码实现了一个基于距离与到达角(AoA)的三维测距系统,主要用于在动态环境中估计目标物体的位置。提供本算法与仅侧角(AoA)的定位误差对比 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分AOA定位绘图部分输出部分代码的应用和意义总结代码运行结…

[241206] X-CMD 发布 v0.4.15:env 升级,mirror 支持华为/腾讯 npm 镜像,pb-wayland 剪贴板

目录 X-CMD 发布 v0.4.15&#x1f4c3;Changelog&#x1f4e6; env|pkg&#x1fa9e; mirror&#x1f4d1; pb&#x1f3a8; theme|starship|ohmyposh&#x1f916; chat&#x1f4dd; man✅ 升级指南 X-CMD 发布 v0.4.15 &#x1f4c3;Changelog &#x1f4e6; env|pkg 新增…

Python办公—DataMatrix二维条码制作

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物

前言 在前端开发中&#xff0c;优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标&#xff0c;Tree Shaking 就是其中一种非常重要的优化技术&#xff0c;它通过在编译阶段移除未被使用的代码模块&#xff0c;从而显著减小最终…

『RabbitMQ』 windows下 安装RabbitMQ 并在Python中使用测试

目录 1. 安装ERLANG2. 安装RabbitMQ3. 新建用户Python的测试代码 生产者和消费者总结欢迎关注 『RabbitMQ』 专栏,持续更新中 欢迎关注 『RabbitMQ』 专栏,持续更新中 1. 安装ERLANG 下载之前先看兼容性,这里我打算下载26.1版本的Erlang以适配RabbitMQ cloud.emqx.com/cons…

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决

概述 在 SwiftUI 的界面布局中&#xff0c;列表&#xff08;List&#xff09;和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道&#xff1a;如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到&#xff1a;当在 List 的…

Ubuntu Linux 文件、目录权限问题

本文为Ubuntu Linux操作系统- 第五弹 此文是在上期文件目录的内容操作基础上接着讲权限问题 上期回顾&#xff1a;Ubuntu Linux 目录和文件的内容操作 文件访问者身份与文件访问权限 Linux文件结构 所有者&#xff08;属主&#xff09;所属组&#xff08;属组&#xff09;其他…

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…