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 router 是 Go语言 中用于处理 HTTP请求 的组件。它能够识别 URL 和 HTTP方法(如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 请求测试
相关文章:
Go 1.19.4 HTTP编程-Day 20
1. HTTP协议 1.1 基本介绍 HTTP协议又称超文本传输协议,属于应用层协议,在传输层使用TCP协议。HTTP协议属是无状态的,对事务处理没有记忆能力,如果需要保存状态需要引用其他技术,如Cookie。HTTP协议属是无连接的&…...
基于微软云第一个大模型程序Java和python实现
1 注册一个微软云账号 按照提示一步一步注册,注册过程中,注册微软云账号需要visa卡。可以在某宝花钱30元买下。 2 部署模型 搜索openAI 创建资源组 部署一个模型 这个后面代码会使用 3 Java 实现 pom 依赖 <dependency><groupId>com…...
【5G】5G目标和标准化 5G targets and standardization
5G标准是在第三代合作伙伴关系项目(3GPP,3rd Generation Partnership Project)中定义的,实际的标准制定工作由参与3GPP活动的区域标准机构成员共同推进。目前,超过600家公司通过各自的地区标准组织成为3GPP的成员。然而…...
KernelShark在ubuntu24.04.01的编译
KernelShark在ubuntu24.04.01的编译 写在前面具体过程装ubuntu24.04.01安装depends下载代码如何编译cmake 输出make 输出 如何安装 初步启动Add the User to the perf Group 简单的使用trace-cmd抓包 来看我的文章,必有所得。 平凡中,总有我帮您踩过的坑…...
【Flutter】WillPopScope组件-监听物理返回键事件自定义返回事件
WillPopScope(onWillPop: () async {if ( flutterWebViewPlugin ! null && await flutterWebViewPlugin.canGoBack() true) {flutterWebViewPlugin!.goBack();return false; // 阻止默认的返回行为} else {return true; // 允许默认的返回行为}},child: Scaffold(),);…...
深度学习每周学习总结J8(Inception V1 算法实战与解析 - 猴痘识别)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结Inception V1 简介1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数&am…...
Django模板系统
1.常用语法 Django模板中只需要记两种特殊符号: {{ }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作。 2.变量 {{ 变量名 }} 变量名由字母数字和下划线组成。 点(.)在模板语言中有…...
【JavaWeb后端学习笔记】MySQL的数据操作语言(Data Manipulation Language,DML)
MySQL DML 0、准备表结构1、添加数据1.1 指定字段添加数据(单条)1.2 全部字段添加数据(单条)1.3 指定字段添加数据(批量)1.4 全部字段添加数据(批量) 2、修改数据3、删除数据 MySQL的…...
【SpringBoot】Day10-09 动态SQL-XML文件
动态SQL-XML文件的三点规范 1.XML映射文件的名称与Mapper接口名称保持一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)- 在项目开发当中,一般都是一个接口对应一份儿映射配置文件; 2.XML映射文件的namesp…...
Linux絮絮叨(三) Ubuntu桌面版添加中文拼音输入法
步骤很详细,直接上教程 一. 配置安装简体拼音输入法 #安装相应的平台支持包 sudo apt install ibus-gtk ibus-gtk3# 安装简体拼音输入法 sudo apt install ibus-pinyin安装完成如果下面的步骤找不到对应输入法可以重启一下,一般不需要 二. 添加简体拼音…...
rockit 学习、开发笔记(六)(VENC)
前言 上节我们讲到了VDEC解码模块,那当然少不了VENC编码模块了,一般有编解码的需求都是为了压缩视频的大小,方便减少传输所占用的带宽。 概述 VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立&am…...
Python+Django框架山东济南景点数据可视化系统网站作品截图和开题报告参考
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...
【C#】键值对的一种常见数据结构Dictionary<TKey, TValue>
在 C# 中,Dictionary<TKey, TValue> 是一个 键值对(key-value)集合,是一种非常常见的数据结构。它允许通过 键(key)来快速查找与之相关的 值(value)。你可以将其类比为一个映射…...
SQL Server:调用的目标发生了异常。(mscorlib)
我之前安装的SQL Server是2014版本,SSMS运行也很流畅,有一次有个同事让我链接云服务器SQL地址,直接报上图的错误,把我弄的一愣一愣的。 后面才发现,这是版本太低导致的,但是你如果使用Navicat是没有问题的…...
windows 上ffmpeg编译好的版本选择
1. Gyan.dev Gyan.dev 是一个广受信赖的 FFmpeg 预编译库提供者,提供多种版本的 FFmpeg,包括静态和动态链接版本。 下载链接: https://www.gyan.dev/ffmpeg/builds/ 特点: 提供最新稳定版和开发版。 支持静态和共享(动态&…...
前端工程化面试题(一)
如何使用 Docker 部署前端项目? 使用 Docker 部署前端项目通常涉及以下几个步骤: 创建项目:首先,需要在本地创建并配置好前端项目。 准备 Docker 文件: .dockerignore:这个文件用于排除不需要上传到 Dock…...
Java设计模式笔记(二)
十四、模版方法模式 1、介绍 1)模板方法模式(Template Method Pattern),又叫模板模式(Template Patern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。 2&…...
vscode(一)安装(ubuntu20.04)
1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...
C# 命名空间(Namespace)
文章目录 前言一、命名空间的定义与使用基础(一)定义语法与规则(二)调用命名空间内元素 二、using 关键字三、嵌套命名空间 前言 命名空间(Namespace)在于提供一种清晰、高效的方式,将一组名称与…...
云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)
计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化)1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化&#…...
Flutter开发App,编译条件下UI没问题,打包后UI出现问题
刚入门Flutter3个月,终于进入项目打包阶段,发现之前编译环境下都正常的UI,忽然有小部分出现异常,不显示UI部分了。查了2个小时都没发现原因。因为编译环境下,Android、iOS端都正常显示。但是进入打包安装后,…...
Python+OpenCV系列:Python和OpenCV的结合和发展
PythonOpenCV系列:Python和OpenCV的结合和发展 **引言****Python语言的发展****1.1 Python的诞生与发展****1.2 Python的核心特性与优势****1.3 Python的应用领域** **OpenCV的发展****2.1 OpenCV的起源与发展****2.2 OpenCV的功能特性****2.3 OpenCV的应用场景** *…...
报错 JSON.parse: expected property name or ‘}‘,JSON数据中对象的key值不为字符串
报错 JSON.parse: expected property name or ‘}’ 原因 多是因为数据转换时出错,可能是存在单引号或者对象key值不为string导致 这里记录下我遇见的问题(后端给的JSON数据里,对象key值不为string) 现在后端转换JSON数据大多…...
Flutter:商品多规格内容总结,响应式数据,高亮切换显示。
如图所示: 代码为练习时写的项目,写的一般,功能实现了,等以后再来优化。 自己模拟的数据结构 var data {id:1,name:精品小米等多种五谷杂粮精品小等多种五谷杂粮,logo:https://cdn.uviewui.com/uview/swiper/1.jpg,price:100.5…...
WPF+LibVLC开发播放器-LibVLC播放控制
接上一篇: LibVLC在C#中的使用 实现LibVLC播放器播放控制 界面 界面上添加一个Button按钮用于控制播放 <ButtonGrid.Row"1"Width"88"Height"24"Margin"10,0,0,0"HorizontalAlignment"Left"VerticalAlignme…...
Mac环境下brew安装LNMP
安装不同版本PHP 在Mac环境下同时运行多个版本的PHP,同Linux环境一样,都是将后台运行的php-fpm设置为不同的端口号,下面将已php7.2 和 php7.4为例 添加 tap 目的:homebrew仅保留最近的php版本,可能没有你需要的版本…...
nodejs后端项目使用pm2部署
nodejs后端项目使用pm2部署 安装pm2 npm install pm2 -g查看版本号 pm2 --version启动项目 pm2 start app.js# 设置别名 pm2 start app.js --name demo停止项目 pm2 stop [AppName] pm2 stop [ID]# 停止所有项目 pm2 stop all重启项目 pm2 restart [AppName] pm2 re…...
【C++】深入理解字符变量取地址的特殊性与内存管理机制详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯栈内存中的变量分配:谁先谁后?cout 的输出行为:按顺序执行,按地址递增读取代码执行顺序与内存布局的关系编译器优化的影响 &…...
【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏ÿ…...
蓝桥杯软件赛系列---lesson1
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们今天会再开一个系列,那就是蓝桥杯系列,我们会从最基础的开始讲起,大家想要备战明年蓝桥杯的,让我们一起加油。 工具安装 DevC…...
工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet
论文:https://arxiv.org/pdf/2311.14897v3.pdf 项目:https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位,这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...
HeidiSQL:MySQL图形化管理工具深度解析
本文还有配套的精品资源,点击获取 简介:HeidiSQL是一款开源的MySQL图形化管理工具,适用于多种数据库系统,如MySQL、MariaDB、SQL Server、PostgreSQL和SQLite。其提供的直观操作界面和丰富的功能简化了数据库操作,包…...
【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南
文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码:主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码:使用布隆过滤器 四、缓存雪崩4…...
Flask使用Celery与多进程管理:优雅处理长时间任务与子进程终止技巧(multiprocessing)(subprocess)
在许多任务处理系统中,我们需要使用异步任务队列来处理繁重的计算或长时间运行的任务,如模型训练。Celery是一个广泛使用的分布式任务队列,而在某些任务中,尤其是涉及到调用独立脚本的场景中,我们需要混合使用multipro…...
【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
报错说明 torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 报错如图所示 报错分析 该报错是 torch 和 CUDA 版本不兼容导致。 (一般N卡自带的CUDA版本与最新的torch版本相差较大) 解决方案 1.查看自己的CUDA版本 # 查看自己的…...
使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面
以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信(这里以 TCP 通信为例)的代码示例,包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio,新建一个 Empty Activity …...
突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!
文章链接:https://arxiv.org/pdf/2411.18623 项目链接:https://lift3d-web.github.io/ 亮点直击 提出了Lift3D,通过系统地提升隐式和显式的3D机器人表示,提升2D基础模型,构建一个3D操作策略。 对于隐式3D机器人表示&a…...
Android KEY的哪些事儿
目录 一、APK应用签名 1、什么是APK应用签名? 1.1 目的和作用? 1.2 长什么样子? 2、APK应用签名使用流程 步骤一:如何生成APK应用签名文件? 步骤二:如何集成APK应用签名文件? 步骤三&am…...
李宏毅深度学习-Pytorch Tutorial2
什么是张量? 张量(Tensor)是深度学习和机器学习中一个非常基础且重要的概念。在数学上,张量可以被看作是向量和矩阵的泛化。简单来说,张量是一种多维数组,它可以表示标量(0维)、向量…...
【译】为 SAP 表维护视图 (SM30) 创建选择屏幕
原文标题:Create Selection Screen for SAP Table Maintenance View (SM30) 原文链接: https://www.saphub.com/abap-dictionary/sap-abap-tmg-selection-screen/ 通常,带有单个屏幕的 SAP 表维护视图 (SM30) 会显示表中的所有记录ÿ…...
element Plus中 el-table表头宽度自适应,不换行
在工作中,使用el-table表格进行开发后,遇到了小屏幕显示器上显示表头文字会出现换行展示,比较影响美观,因此需要让表头的宽度变为不换行,且由内容自动撑开。 以下是作为工作记录,用于demo演示教程 先贴个…...
C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数
知识要点:数组作函数参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序,前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...
时间序列模型在LSTM中的特征输入
这里写目录标题 前言LSTM的输入组成时间步例子 实际代码解读特征提取处理成dataloader格式(用于输入到模型当中)对应到lstm的模型创建代码 总结 前言 本文章将帮助理解如何将一个时间序列的各种特征(年月日的时间特征,滚动窗口滞…...
Python_Flask02
所有人都不许学Java了,都来学Python! 如果不来学的话请网爆我的老师 连接前的准备 安装pymysql 和 flask_sqlalchemy,安装第三下面两个所需要的包才能连接上数据库 pip install pymysql pip install flask_sqlalchemy pymysql是一个Pyth…...
threejs相机辅助对象cameraHelper
为指定相机创建一个辅助对象,显示这个相机的视锥。 想要在场景里面显示相机的视锥,需要创建两个相机。 举个例子,场景中有个相机A,想要显示相机A的视锥,那么需要一个相机B,把B放在A的后面,两个…...
断点续传+测试方法完整示例
因为看不懂网上的断点续传案例,而且又不能直接复制使用,干脆自己想想写了一个。 上传入参类: import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProp…...
C#设计模式--状态模式(State Pattern)
状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。这种模式的核心思想是将状态封装在独立的对象中,而不是将状态逻辑散布在整个程序中。 用途 简化复杂的条件逻辑:通过将不同的状态封装在不同的类中,可…...
Excel技巧:如何批量调整excel表格中的图片?
插入到excel表格中的图片大小不一,如何做到每张图片都完美的与单元格大小相同?并且能够根据单元格来改变大小?今天分享,excel表格里的图片如何批量调整大小。 方法如下: 点击表格中的一个图片,然后按住Ct…...
hadoop中导出表与数据的步骤
大家好,我是 V 哥。在Hadoop中导出表与数据,可以通过多种方式实现,包括使用Hive的EXPORT命令、MapReduce作业、Hive查询以及Sqoop工具。下面V 哥将详细介绍这些步骤和一些代码示例,来帮助大家更好理解。 1. 使用Hive的EXPORT命令…...
springBoot中的日志级别在哪里配置
在Spring Boot中,日志级别的配置可以通过多种方式来实现,主要包括在配置文件中设置、使用自定义的logback配置文件,以及在代码中动态配置等。以下是一些具体的配置方法: 一、在配置文件中设置日志级别 Spring Boot默认使用appli…...