【Golang】Go语言http编程底层逻辑实现原理与实战

news2024/11/23 22:36:03

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言http编程
    • 一、HTTP基础概念
      • 1. HTTP请求
      • 2. HTTP响应
      • 3. HTTP/1.1与HTTP/2
    • 二、http编程实战
      • 1. HTTP服务器
      • 2. HTTP客户端
      • 3. 带参数的请求
      • 4. POST请求提交Form表单
      • 5. POST请求提交Json数据
    • 三、错误处理

Go语言http编程

HTTP(HyperText Transfer Protocol)是互联网上应用最广泛的一种网络协议。无论是浏览网页、使用API进行数据传输,还是实现微服务架构,HTTP都扮演着至关重要的角色。Go语言(又称Golang)以其简洁、高效和强大的并发处理能力,成为了HTTP编程的优选语言之一。

一、HTTP基础概念

在深入了解Go语言的HTTP编程之前,我们需要先了解一些HTTP的基础知识。

1. HTTP请求

请求方法(GET、POST、PUT、DELETE等)
请求URL(包括协议、主机名、端口号、路径和查询参数)
请求头(包含元数据,如Content-Type、Authorization等)
请求体(对于POST、PUT等请求方法,通常包含要发送的数据)

2. HTTP响应

状态码(如200 OK、404 Not Found、500 Internal Server Error等)
响应头(包含元数据,如Content-Type、Location等)
响应体(包含返回的数据)

3. HTTP/1.1与HTTP/2

HTTP/1.1是广泛使用的版本,支持持久连接和缓存控制。
HTTP/2引入了多路复用、头部压缩和服务器推送等特性,提高了性能。

二、http编程实战

1. HTTP服务器

Go语言内置的net/http包提供了简单的HTTP服务器实现。
开启监听程序的代码是放在main方法的最后一行的
以下是一个基本的HTTP服务器示例:

// http_server.go
package main

import (
    "fmt"
    "net/http"
)

// 定义发送接收数据函数
func helloHandler(w http.ResponseWriter, r *http.Request) {

    // 给浏览器响应数据
    // 一般会响应一些信息给客户端 (文字、网页) resp.Write
    // 响应一段文字[]byte("hello,web")
    // 响应一段html代码 []byte("html代码") 网页
    // Write([]byte) (int, error)
    _, err := w.Write([]byte("<h1>感谢大家来到景天科技苑!</h1>"))
    if err != nil {
        return
    }

    //查看请求
    fmt.Println("请求方法: ", r.Method)
    fmt.Println("请求体: ", r.Body)
    fmt.Println("请求头", r.Header)
    fmt.Println("请求路径:", r.URL)
    fmt.Println("客户端地址:", r.RemoteAddr) //包含ip和端口号
}

func main() {
    // HandleFunc http请求的处理函数

    // http程序启动之后是不会停止的,一直监听请求
    // 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter
    // func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
    //第一个参数是请求路径,第二个参数是一个函数
    http.HandleFunc("/", helloHandler)
    fmt.Println("Starting server at :8080")
    // func ListenAndServe(addr string, handler Handler) error
    // ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。
    //如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。
    //如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。

    // 开启监听程序的代码是放在main方法的最后一行的。
    if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

浏览器访问
在这里插入图片描述

2. HTTP客户端

除了HTTP服务器,Go语言也提供了强大的HTTP客户端功能。以下是一个基本的HTTP客户端示例:

package main

import (
    "fmt"
    "io"
    "net/http"
)

// 手写客户端访问
func main() {

    /*
       http.Get()
    */

    // 一个请求包含 请求方式   请求的url   接收响应结果
    // func Get(url string) (resp *Response, err error)
    resp, _ := http.Get("http://localhost:8080")
    // 通过defer关闭连接 resp.Body 响应的主体
    //通过Body来关闭
    defer resp.Body.Close()

    fmt.Println(resp.Body)
    fmt.Println(resp.Status) // 200 OK
    fmt.Println(resp.Header) // 响应头

    // 接收具体的响应内容,从Body里面获取
    //Body是IO流
    // The response body is streamed on demand as the Body field is read.
    // Body io.ReadCloser
    //循环从Body流中读取
    buf := make([]byte, 1024)
    for {
        n, err := resp.Body.Read(buf)
        if err != nil && err != io.EOF {
            fmt.Println("读取出现了错误")
            return
        } else {
            fmt.Println("读取完毕")
            res := string(buf[:n])
            fmt.Println("服务器响应的数据为:", res)
            break
        }

    }

}

在这里插入图片描述

3. 带参数的请求

客户端编写

  • url的参数拼接 ?拼接 & 连接
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    // 复杂请求
    urlStr := "http://127.0.0.1:8080/login" // ?

    // 参数如何拼接到url上,参数封装为数据url.Values{}
    data := url.Values{}
    //通过url.Values.Set()方法,将参数拼接到url上
    data.Set("username", "admin")  // ?
    data.Set("password", "123456") // ?

    // 将url字符串转化为url对象,并给携带数据
    // func ParseRequestURI(rawURL string) (*URL, error)
    urlNew, _ := url.ParseRequestURI(urlStr)
    urlNew.RawQuery = data.Encode()
    // http://127.0.0.1:8080/login?password=123456&username=admin
    // ? get的传参,多个参数之间使用 & 连接
    fmt.Println(urlNew)
    //查看类型
    fmt.Printf("%T \n", urlNew)

    // 发请求,参数是一个字符串地址
    resp, _ := http.Get(urlNew.String())
    defer resp.Body.Close()
    // 读取resp响应信息,一次性读完,返回buf
    // func ReadAll(r Reader) ([]byte, error)
    buf, _ := io.ReadAll(resp.Body)
    fmt.Println(string(buf))
}

服务端:


// http_server.go
package main

import (
    "fmt"
    "net/http"
)

// 定义发送接收数据函数
func login(resp http.ResponseWriter, req *http.Request) {
    // 模拟数据库中存在一个数据
    mysqlUserData := "admin"
    mysqlPwdData := "123456"

    fmt.Println("接收到了login请求")
    // 拿到请求中的查询参数
    urlData := req.URL.Query()
    username := urlData.Get("username")
    password := urlData.Get("password")

    // 登录逻辑, 将客户端发送的数据和系统数据比对实现登录业务
    if username == mysqlUserData {
        if password == mysqlPwdData {
            resp.Write([]byte("登录成功"))
        } else {
            resp.Write([]byte("密码错误"))
        }
    } else {
        resp.Write([]byte("登录失败"))
    }

}

func main() {
    // HandleFunc http请求的处理函数
    // http程序启动之后是不会停止的,一直监听请求
    // 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter
    // func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
    //第一个参数是请求路径,第二个参数是一个函数
    http.HandleFunc("/login", login)
    fmt.Println("Starting server at :8080")
    // func ListenAndServe(addr string, handler Handler) error
    // ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。
    //如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。
    //如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。
    // 开启监听程序的代码是放在main方法的最后一行的。
    if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

登录成功
在这里插入图片描述

4. POST请求提交Form表单

客户端

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    // 目标URL
    urlStr := "http://127.0.0.1:8080/register"

    // 构建表单数据
    formData := url.Values{}
    formData.Set("username", "admin")
    formData.Set("password", "123456")

    // 发送POST请求
    // func PostForm(url string, data url.Values) (resp *Response, err error)
    resp, err := http.PostForm(urlStr, formData)
    if err != nil {
        fmt.Println("Error sending POST request:", err)
        return
    }
    defer resp.Body.Close()

    // 读取响应体
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response body:", err)
        return
    }

    // 打印响应状态码和响应体
    fmt.Println("Response Status:", resp.Status)
    fmt.Println("Response Body:", string(body))
}

在这个例子中,我们首先定义了目标URL和表单数据。然后,我们使用 url.Values 类型的 formData 来存储表单键值对,并通过 formData.Set 方法添加数据。最后,我们调用 http.PostForm 函数发送请求,并处理响应。

请注意,http.PostForm 简化了表单数据的发送过程,但如果你需要发送非表单数据(如JSON),你应该使用 http.NewRequest 和 http.Client.Do 方法来构建和发送自定义请求。
此外,http.PostForm 发送的请求体是 application/x-www-form-urlencoded 格式的,这通常用于HTML表单提交,但不适用于所有类型的API请求。

服务端

// http_server.go
package main

import (
    "fmt"
    "net/http"
)

// 定义发送接收数据函数
func register(resp http.ResponseWriter, req *http.Request) {
    fmt.Println("接收到了注册请求")
    // 解析表单
    // 处理表单的请求, 前端提交表单-后盾解析表单
    // func (r *Request) ParseForm() error
    err := req.ParseForm()
    if err != nil {
        return
    }

    // 获取表单参数 post
    username := req.PostForm.Get("username")
    password := req.PostForm.Get("password")
    fmt.Println(username, password)
    // 很多的判断
    // 短信
    // 验证码
    // 存到数据库
    resp.Write([]byte("注册成功"))
}

func main() {
    // HandleFunc http请求的处理函数
    // http程序启动之后是不会停止的,一直监听请求
    // 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter
    // func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
    //第一个参数是请求路径,第二个参数是一个函数
    http.HandleFunc("/register", register)
    fmt.Println("Starting server at :8080")
    // func ListenAndServe(addr string, handler Handler) error
    // ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。
    //如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。
    //如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。
    // 开启监听程序的代码是放在main方法的最后一行的。
    if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

客户端运行
在这里插入图片描述

服务端运行
在这里插入图片描述

http.NewRequest 和 http.Client.Do 发送表单请求

客户端:

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    // 构建HTTP客户端
    client := &http.Client{}

    // 定义POST URL
    myurl := "http://127.0.0.1:8080/register"

    // 定义HTTP负载
    data := url.Values{}
    data.Set("username", "John Doe")
    data.Set("password", "123456")
    // 将url.Values编码为表单格式的字符串,并创建一个Reader
    payload := strings.NewReader(data.Encode())

    // 发送POST请求
    // func NewRequest(method, url string, body io.Reader) (*Request, error)
    req, err := http.NewRequest("POST", myurl, payload)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    // 设置HTTP消息头
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    // 执行HTTP请求
    // func (c *Client) Do(req *Request) (*Response, error)
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()

    // 读取响应状态码
    fmt.Println("Response Status:", resp.Status)

    // 读取响应体
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response body:", err)
        return
    }

    // 打印响应体
    fmt.Println("Response Body:", string(body))
}

在这里插入图片描述

5. POST请求提交Json数据

有时,我们需要发送JSON格式的POST请求。为此,我们可以使用encoding/json包将数据结构转换为JSON字符串,然后将其作为请求体发送。

客户端:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

type LoginRequest struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

func main() {
    // 创建一个http.Client对象
    client := &http.Client{}

    // 构建一个LoginRequest对象
    data := LoginRequest{
        Username: "zhangsan",
        Password: "password",
    }

    // 将LoginRequest对象转换为JSON字符串
    jsonData, err := json.Marshal(data)
    if err != nil {
        fmt.Println("JSON编码失败:", err)
        return
    }

    // 创建一个请求对象
    req, err := http.NewRequest("POST", "http://127.0.0.1:8080/post", bytes.NewBuffer(jsonData))
    if err != nil {
        fmt.Println("创建请求失败:", err)
        return
    }

    // 设置请求头的内容类型为application/json
    req.Header.Set("Content-Type", "application/json")

    // 发送请求并获取响应
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("请求发送失败:", err)
        return
    }
    defer resp.Body.Close()

    // 读取并处理服务器返回的响应
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应失败:", err)
        return
    }
    fmt.Println("响应状态码:", resp.StatusCode)
    fmt.Println("响应内容:", string(body))
}

服务端:

// http_server.go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

type Result struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

// 定义发送接收数据函数
func postHandler(resp http.ResponseWriter, req *http.Request) {
    // 确保处理的是POST请求
    if req.Method != "POST" {
        http.Error(resp, "Invalid request method", http.StatusMethodNotAllowed)
        return
    }

    // 读取请求体中的数据
    body, err := io.ReadAll(req.Body)
    if err != nil {
        http.Error(resp, "Error reading request body", http.StatusInternalServerError)
        return
    }
    defer req.Body.Close()

    // 打印请求体中的数据
    fmt.Printf("Received POST request with body: %s\n", string(body))

    //将json字符串反序列化为原生结构体
    var result Result
    if err := json.Unmarshal(body, &result); err != nil {
        http.Error(resp, "Error parsing request body", http.StatusInternalServerError)
    }
    fmt.Println("客户端发来的数据:", result)
    fmt.Printf("客户端发来的数据:%+v\n", result)
    fmt.Printf("数据类型%T\n", result)

    // 发送响应给客户端
    // Received your POST request. This is the response!
    resp.Write([]byte("服务端接收到数据"))
}

func main() {
    // HandleFunc http请求的处理函数
    // http程序启动之后是不会停止的,一直监听请求
    // 访问这个url就会触发 helloHandler 函数 (Request) ResponseWriter
    // func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
    //第一个参数是请求路径,第二个参数是一个函数
    http.HandleFunc("/post", postHandler)
    fmt.Println("Starting server at :8080")
    // func ListenAndServe(addr string, handler Handler) error
    // ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。
    //如果用户自定义实现了Handler,那么根据相应路径在map中查询到相对应的Handler,然后再调用用户自定义的ServeHTTP处理请求。
    //如果用户没有自定义Handler,只注册了对应处理函数(使用了http.HandleFunc),那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler,然后再调用ServeHTTP处理函数。
    // 开启监听程序的代码是放在main方法的最后一行的。
    if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

运行服务端,客户端,请求成功,服务端拿到json数据。
在这里插入图片描述

三、错误处理

在HTTP编程中,错误处理是非常重要的。我们需要优雅地处理各种可能的错误,如网络错误、解析错误、数据库错误等。

下面是一个简单的错误处理示例。

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

type ErrorResponse struct {
	Error string `json:"error"`
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
	// 模拟一个错误
	err := fmt.Errorf("something went wrong")
	if err != nil {
		handleError(w, err)
		return
	}

	fmt.Fprintf(w, "Hello, World!")
}

func handleError(w http.ResponseWriter, err error) {
	log.Println("Error:", err)
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusInternalServerError)
	json.NewEncoder(w).Encode(ErrorResponse{Error: err.Error()})
}

func main() {
	http.HandleFunc("/", helloHandler)
	fmt.Println("Starting server at :8080")
	if err := http.ListenAndServe(":8080", nil); err != nil {
		fmt.Println("Error starting server:", err)
	}
}

在这个示例中,我们定义了一个ErrorResponse结构体,用于表示错误响应。然后,在helloHandler中,我们模拟了一个错误,并调用handleError函数来处理该错误。handleError函数记录了错误日志,设置了响应头和内容类型,并返回了一个JSON格式的错误响应。

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

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

相关文章

前端全栈混合之路Deno篇:Deno2.0与Bun对比,谁更胜一筹?它们分别适合怎样的项目,谁更适合前端转全栈?

在前端全栈开发中&#xff0c;工具的不断演变让开发者们始终在寻找更高效、更现代化的解决方案。继Node.js之后&#xff0c;Deno和Bun 成为了两个比较火热的运行时。Deno2.0的近期的发布让它在性能和兼容性方面大幅提升-尤其是兼容了npm包&#xff08;但我感觉应该不是全部兼容…

Linux源码阅读笔记-设备驱动程序

基础知识 Linux 内核输入子系统是对分散、多种不同类别的输入设备&#xff08;鼠标、键盘、触摸屏、手写板等&#xff09;进行统一的驱动程序。优势&#xff1a;统一物理形态各异相似输入设备处理功能&#xff1b;提供分发输入报告给用户应用程序的简单事件接口&#xff1b;抽…

DW-大模型生图安全疫苗注入作业记录

Task1.跑通baseline Task2.赛题评测方法 //------------------------------------------------------------------------- Task1-BaseLine 创建实例后与你运行代码&#xff0c;git clone model 太慢了 上modelspace 找到通义千问下载 模型下载慢问题 解决办法 modelscope do…

【数据分析】估算问题(费米估算问题)

1. 费米估算 费米估算问题是一种估算方法&#xff0c;它要求在没有足够信息的情况下&#xff0c;通过合理的假设和简化模型来计算一个复杂问题的大致答案。这种估算方法以意大利物理学家恩里科费米命名&#xff0c;他以能够在没有精确数据的情况下进行快速而准确的估算而闻名。…

ssm基于Web的老年公寓信息管理+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环境与技术 3 …

web3还未真正普及,网页已经漂亮的不像话了。

尽管 Web3 还未真正普及开来&#xff0c;但如今的网页已经呈现出令人惊叹的美丽景象。设计师们凭借着先进的技术和无限的创意&#xff0c;打造出一个个精美绝伦的网页界面。 色彩的搭配和谐而富有吸引力&#xff0c;布局合理且充满艺术感。动画效果生动活泼&#xff0c;为用户…

YOLOv8模型改进 第七讲 一种新颖的注意力机制 Outlook Attention

随着目标检测技术的不断发展&#xff0c;YOLOv8 作为最新一代的目标检测模型&#xff0c;已经在多个基准数据集上展现了其卓越的性能。然而&#xff0c;在复杂场景中&#xff0c;如何进一步提升模型的检测精度和鲁棒性依然是一个重要挑战。本文将探讨将 Outlook Attention 机制…

头戴式耳机300元预算选择有哪些?头戴式耳机300元左右五款推荐!

晚上下班或周末在家&#xff0c;想要沉浸式观影、游戏&#xff0c;肯定少不了一款头戴式耳机&#xff0c;它的两个大耳罩既不会像入耳式耳机那样对耳仓产生压迫不适感&#xff0c;也能全面包裹耳朵必要时尽可能的隔绝外界环境音&#xff0c;比那种把耳朵开放在外的骨传导耳机更…

FreeRtos到底是什么?

一&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统&#xff0c;功能包括&#xff1a;任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等&…

lua脚本使用cjson转换json时,空数组[]变成了空对象{}

一、前言 项目lua使用工具&#xff1a;cjson 问题&#xff1a;reids中部分数据的json key存在为[]的值&#xff0c;使用cjson进行解析的时候将原本空数组[]解析成了空对象{} 目标&#xff1a;原本[] 转 [] 二、解决方案 在使用cjson类库时&#xff0c;先配置json转换要求 -…

信息与计算科学:“数学 + 计算机”,奏响未来科技新乐章

在当今科技飞速发展的时代&#xff0c;有一个专业如同一颗闪耀的新星&#xff0c;散发着独特的魅力&#xff0c;那就是信息与计算科学专业。 一、专业全貌&#xff1a;追根溯源&#xff0c;领略交叉之美 &#xff08;一&#xff09;专业的诞生与发展 1998 年&#xff0c;教育…

线上代码调试,使用Chorme的请求mock

前端页面上展示的数据有问题&#xff0c;第一反应肯定是要验证是不是接口返回的数据的问题 可以直接利用谷歌浏览器更改接口返回的返回值 如何使用谷歌浏览器mock请求 mock一个请求&#xff0c;我们首先需要打开浏览器的Network面板&#xff0c;找到请求后&#xff0c;点击鼠标…

【Python异常处理】详解Python中的异常捕获和处理!

【Python异常处理】详解Python中的异常捕获和处理&#xff01; 在编写 Python 程序时&#xff0c;异常是不可避免的。无论是输入错误、资源不可用&#xff0c;还是其他逻辑问题&#xff0c;都会导致程序中断。为了编写更健壮的代码&#xff0c;理解并使用 Python 中的异常捕获…

解密1688详情 API 接口:获取与运用指南

1688&#xff08;阿里巴巴中国站&#xff09;作为国内领先的B2B电子商务平台&#xff0c;为企业提供商品批发、采购等业务。随着电子商务的快速发展&#xff0c;企业对于数据的需求日益增长。为了帮助企业更高效地获取商品信息&#xff0c;1688提供了丰富的API接口&#xff0c;…

华为eNSP实验:交换机流量控制之流量抑制

一、交换机流量控制之流量抑制 流量抑制是一种网络管理技术&#xff0c;用于防止过量的数据流通过网络设备&#xff0c;从而避免网络拥塞和性能下降。具体如下&#xff1a; 基本原理&#xff1a; 流量抑制通过设置特定的阈值来限制网络中的数据流量。当某个端口或接口的入站流…

第三课:python学习之安装pygame

首先确定自己的python已经将环境变量配置完成 第二步&#xff1a;敲击python命令看环境变量是否配置成功 第三步&#xff1a;敲击命令pip可以查看pip下有很多的命令&#xff0c;都有提示 第四步&#xff1a;我们开始安装pygame,我们使用pip install pygame命令进行安装 第五步…

【MySQL基础刷题】总结题型(二)

最多10题&#xff0c;再多不消化了 1.至少有5名直接下属的经理2.销售员3.订单最多的客户4.计算布尔表达式的值5.查询球队积分6.苹果和桔子7.两人之间的通话次数8.确认率9.各赛事的用户注册率 1.至少有5名直接下属的经理 注意左连接的使用 select e1.name from Employee e1 lef…

静态路由、动态路由以及默认路由

默写&#xff1a; ARP协议作用&#xff1a; 1.将ip地址转换为mac地址 2.检测ip地址是否有冲突&#xff08;无故ARP&#xff0c;免费ARP&#xff09; icmp协议&#xff1a; 检测主机双向连通性 tcp与udp的区别&#xff1a; tcp&#xff1a;面向连接&#xff0c;慢&#xf…

【测试基础篇1】一文搞懂软件测试基础知识,开启测试之路,走向测试人生巅峰

简介&#xff1a;一文搞懂软件测试&#xff0c;开启测试之路&#xff0c;走向测试人生。 一、软件测试的定义 维基百科定义&#xff1a; 软件测试的经典定义是&#xff1a;在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其…

TypeScript数据类型限定(基本数据类型,void,数组,元组,枚举,any,unknown,never,函数,自定义数据类型,联合类型和交叉类型)

一、安装解析ts的工具包 node.js只认识js代码&#xff0c;不认识ts代码。 需要将ts代码转化为js&#xff0c;然后就可以在node.js中运行了。 安装步骤&#xff1a;打开终端&#xff0c;输入命令npm i -g typescript回车 typescript是用来解析ts的工具包。提供了tsc命令&…